762. 二进制表示中质数个计算置位

题目

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

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

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

示例1:

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

示例2:

1
2
3
4
5
6
7
8
9
10
输入: 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 不是质数)
共计 5 个计算置位为质数的数字。

提示:

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

解法

解法一:

10^6是小于2^20次方的,那就意味着问题可以转换为,在2的20次方之内,找到整数二进制数内数字1总数为质数的总数。
那问题就可以简化为,从L遍历到R,将整数转换为二进制,统计里面的1的个数,然后判断是否是20以内的质数,是总数加1,最后返回总数即可。

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public int countPrimeSetBits(int L, int R) {
HashSet<Integer> primes = new HashSet<>();
primes.add(2);
primes.add(3);
primes.add(5);
primes.add(7);
primes.add(11);
primes.add(13);
primes.add(17);
primes.add(19);
int sum = 0;
for (int i = L;i <= R;i++) {
int value = Integer.bitCount(i);
if (primes.contains(value)) {
sum++;
}
}
return sum;
}
0%