LeetCode刷题记录(五):二进制表示中质数个计算置位

170 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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;
    }
}

执行结果

大家一起刷,才更有意思。

所以,你今天刷题打卡了吗?

图片