762. 二进制表示中质数个计算置位
countPrimeSetBits
一、解题思路
1、解法一( Java )
解法思路:简单模拟
☝Integer.bitCount(i)
计算二进制中 1
的个数
☝最小的质数是 2
,当 res
是 1
时 continue
⚡️每次外层循环结束后要对 flag
进行更新
⚡️内层循环算法优化为 j <= Math.sqrt(res)
伪代码如下:
/**
* @author Listen 1024
* @description 762. 二进制表示中质数个计算置位
* @date 2022-04-05 8:57
*/
class Solution{
public int countPrimeSetBits(int left, int right) {
int cnt = 0;
//闭区间且最小的质数是2
for (int i = left; i <= right; i++) {
boolean flag = true;
int res = Integer.bitCount(i);//res是计算置位位数即二进制表示中 1 的个数
//System.out.println(res);
if (res == 1) {
continue;
}
for (int j = 2; j <= Math.sqrt(res); j++) {
if (res % j == 0) {
flag = false;
break;
}
}
if (flag) {
cnt++;
}
}
return cnt;
}
}
2、解法二( Java )
解法思路:简单模拟 + lowbit
⚡️利用一个 int
的二进制表示的数位不超过 32
,我们可以先将 32 以内的质数
进行打表
。
⚡️利用 lowbit
操作统计 x
共有多少位 1
/**
* @author Listen 1024
* @description 762. 二进制表示中质数个计算置位
* @date 2022-04-05 8:57
*/
class Solution{
public int countPrimeSetBits(int left, int right) {
//提前打表 + lowbit
int res = 0;
//利用一个 int 的二进制表示不超过 32,我们可以先将 32 以内的质数进行打表
int[] nums = new int[]{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31};
boolean[] hash = new boolean[40];
for (int index : nums) {
hash[index] = true;
}
for (int i = left; i <= right; i++) {
int cnt = 0;
int x = i;
while (x != 0 && ++cnt >= 0) {
x -= (x & (-x));//lowbit操作
}
if (hash[cnt]) {
res++;
}
}
return res;
}
}
解法二参考链接
https://leetcode-cn.com/problems/prime-number-of-set-bits-in-binary-representation/solution/by-ac_oier-w50x/
运行结果截图如下: