Skip to content

Latest commit

 

History

History

0762.Prime Number of Set Bits in Binary Representation

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 

English Version

题目描述

给你两个整数 left 和 right ,在闭区间 [left, right] 范围内,统计并返回 计算置位位数为质数 的整数个数。

计算置位位数 就是二进制表示中 1 的个数。

  • 例如, 21 的二进制表示 10101 有 3 个计算置位。

 

示例 1:

输入:left = 6, right = 10
输出:4
解释:
6 -> 110 (2 个计算置位,2 是质数)
7 -> 111 (3 个计算置位,3 是质数)
9 -> 1001 (2 个计算置位,2 是质数)
10-> 1010 (2 个计算置位,2 是质数)
共计 4 个计算置位为质数的数字。

示例 2:

输入:left = 10, right = 15
输出:5
解释:
10 -> 1010 (2 个计算置位, 2 是质数)
11 -> 1011 (3 个计算置位, 3 是质数)
12 -> 1100 (2 个计算置位, 2 是质数)
13 -> 1101 (3 个计算置位, 3 是质数)
14 -> 1110 (3 个计算置位, 3 是质数)
15 -> 1111 (4 个计算置位, 4 不是质数)
共计 5 个计算置位为质数的数字。

 

提示:

  • 1 <= left <= right <= 106
  • 0 <= right - left <= 104

解法

题目中 leftright 的范围均在 106 内,而 220=1048576,因此二进制中 1 的个数最多也就 20 个,20 以内的质数为 {2, 3, 5, 7, 11, 13, 17, 19}。

我们可以遍历 [left, right] 范围内的每个数,计算出每个数的二进制表示中 1 的个数,判断此个数是否在上述列举的质数中,是则累加结果。

时间复杂度 O((right-left)*log right),其中求二进制中 1 的个数的时间为 O(log right)

Python3

class Solution:
    def countPrimeSetBits(self, left: int, right: int) -> int:
        primes = {2, 3, 5, 7, 11, 13, 17, 19}
        return sum(i.bit_count() in primes for i in range(left, right + 1))

Java

class Solution {
    private static Set<Integer> primes = new HashSet<>(Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19));

    public int countPrimeSetBits(int left, int right) {
        int ans = 0;
        for (int i = left; i <= right; ++i) {
            if (primes.contains(Integer.bitCount(i))) {
                ++ans;
            }
        }
        return ans;
    }
}

C++

class Solution {
public:
    unordered_set<int> primes{2, 3, 5, 7, 11, 13, 17, 19};

    int countPrimeSetBits(int left, int right) {
        int ans = 0;
        for (int i = left; i <= right; ++i)
            if (primes.count(__builtin_popcount(i)))
                ++ans;
        return ans;
    }
};

Go

func countPrimeSetBits(left int, right int) int {
	primes := map[int]bool{2: true, 3: true, 5: true, 7: true, 11: true, 13: true, 17: true, 19: true}
	ans := 0
	for i := left; i <= right; i++ {
		if primes[bits.OnesCount(uint(i))] {
			ans++
		}
	}
	return ans
}

...