762. Prime Number of Set Bits in Binary Representation
题目
Given two integers L
and R
, find the count of numbers in the range [L, R]
(inclusive) having a prime number of set bits in their binary representation.
(Recall that the number of set bits an integer has is the number of 1
s present when written in binary. For example, 21
written in binary is 10101
which has 3 set bits. Also, 1 is not a prime.)
Example 1:
Input: L = 6, R = 10
Output: 4
Explanation:
6 -> 110 (2 set bits, 2 is prime)
7 -> 111 (3 set bits, 3 is prime)
9 -> 1001 (2 set bits , 2 is prime)
10->1010 (2 set bits , 2 is prime)
Example 2:
Input: L = 10, R = 15
Output: 5
Explanation:
10 -> 1010 (2 set bits, 2 is prime)
11 -> 1011 (3 set bits, 3 is prime)
12 -> 1100 (2 set bits, 2 is prime)
13 -> 1101 (3 set bits, 3 is prime)
14 -> 1110 (3 set bits, 3 is prime)
15 -> 1111 (4 set bits, 4 is not prime)
Note:
- L, R will be integers L <= R in the range [1, 10^6].
- R - L will be at most 10000.
解决
1.利用位运算来数1
的个数
【n为[L, R]的数字个数,len为R的二进制的位数】
- 时间复杂度:O(n * m)
- 空间复杂度:O(1)
// First Solution(Runtime: 39ms)
class Solution {
public:
int countPrimeSetBits(int L, int R) {
set<int> primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
int result = 0;
for (int i = L; i <= R; i++) {
// determine every number in [L, R]
int bits = 0;
for (int b = i; b; b >>= 1) { // shift operation
// determine if the end is 1
bits += b & 1;
}
result += primes.count(bits);
}
return result;
}
};
2.利用bitset来数1
的个数
【n为[L, R]的数字个数,len为R的二进制的位数】
- 时间复杂度:O(n * m)
- 空间复杂度:O(1)
虽然复杂度没有太大的变化,但是利用bitset
可以简化十进制转换为二进制。
并且bitset
中有函数count()
可以统计其中1
的个数。
// Second Solution(Runtime: 21ms)
class Solution {
public:
int countPrimeSetBits(int L, int R) {
set<int> primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
int result = 0;
for (int i = L; i <= R; i++) {
bitset<100> b(i);
result += primes.count(b.count());
}
return result;
}
};