一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
二进制表示中质数个计算置位
题目如下图所示,也可以在LeetCode题目中找到此题。
题目解析
题目提供素材:
1. 两个数值,也可以说成是一个整数闭区间,比如[1,6]。
题目预期结果:
找出在这个区间中“计算置位位数为质数”的整数个数。
计算置位位数:在题目描述中解释了,代表着二进制表示中 1 的个数。
我的解决过程
我们将题目的预期拆分成两步。
1. 先统计二进制数值中1的个数total。
2. 再计算total是否是质数。
3. 记录到变量sum中。
开始编写
针对题目的描述和预期结果,我用比较暴力的方式实现了第一版的代码,具体代码如下所示:
class Solution {
public int countPrimeSetBits(int left, int right) {
int total = 0;
for(int i = left; i <= right; i++){
int sum = 0;
int n = i;
while(n > 0){
if(n % 2 != 0) {
sum++;
}
n = n >> 1;
}
boolean flag = true;
if (sum >= 2) {
for (int j = 2; j * j <= sum; j++) {
if (sum % j == 0) {
flag = false;
break;
}
}
}else{
flag = false;
}
if(flag){
total++;
}
}
return total;
}
}
使用上述代码是可以实现预期效果的,但是循环次数明显用的太多了。
所以就引出了另一个知识点,那就是lowbit,也就是计算十进制数值转为二进制时1的数量。
在Java中提供了这一算法的实现,也就是Integer类中bitCount方法,完整了实现lowbit。
所以又再次更新了一版代码,具体如下所示:
class Solution {
public int countPrimeSetBits(int left, int right) {
int total = 0;
for(int i = left; i <= right; i++){
int sum = Integer.bitCount(i);
boolean flag = true;
if (sum >= 2) {
for (int j = 2; j * j <= sum; j++) {
if (sum % j == 0) {
flag = false;
break;
}
}
}else{
flag = false;
}
if(flag){
total++;
}
}
return total;
}
}
执行结果
大家一起刷,才更有意思。
所以,你今天刷题打卡了吗?