给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数。
(注意,计算置位代表二进制表示中1的个数。例如 21 的二进制表示 10101 有 3 个计算置位。还有,1 不是质数。)
示例 1:
输入: L = 6, R = 10 输出: 4 解释: 6 -> 110 (2 个计算置位,2 是质数) 7 -> 111 (3 个计算置位,3 是质数) 9 -> 1001 (2 个计算置位,2 是质数) 10-> 1010 (2 个计算置位,2 是质数)
示例 2:
输入: L = 10, R = 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 不是质数)
注意:
L, R是L <= R且在[1, 10^6]中的整数。R - L的最大值为 10000。
class Solution {
public:
int countPrimeSetBits(int L, int R) {
set<int> primes = { 2, 3, 5, 7, 11, 13, 17, 19 };
int res = 0;
for (int i = L; i <= R; i++)
{
int num = 0;
int temp = i;
while (temp > 0)
{
if (temp% 2 == 1) num++;
temp = temp /2;
}
res += primes.count(num);
}
return res;
}
};
注意的set.count用法class Solution {
public:
int countPrimeSetBits(int L, int R) {
set<int> s = {2, 3, 5, 7, 11, 13,17, 19};//注意此处L和R的范围,最大值为10^6,而19个1的二进制刚好小于10^6,20个1的二进制就大于10^6 了,所以1的最大个数也只是19个
int res = 0;
for (int i = L; i <= R; i++) {
int cnt = 0, tmp = i;
while (tmp) {
tmp &= (tmp - 1);
cnt++;
}
if (s.count(cnt))
res++;//此处利用set容器的count方法,来看数字是否是容器中存在的质数
}
return res;
}
};下面的方法快一点,关键点在于 tmp &= (tmp - 1);

281

被折叠的 条评论
为什么被折叠?



