2022/04/05 leetcode 每日一题 762. 二进制表示中质数个计算置位

1.题目

2.求解

看到这题的时候我第一想到的是数位dp的方式去求解 但是太久每做数位dp 模板忘了 待我再去学习一下数位dp的题目再来看看这道题会不会有新的想法

        这道题最后使用了lowbit去求解,对一个数的二进制找到它的最后一位1,减去即可,cnt共有多少个1,质数方面因为 10的6次方<2的20次方 因此开个20的数组就好了 20以内的质数掰着手指头数出来(笑)

3.代码

class Solution {
public:
    bool zhishu[25];
    void init(){
        int nums[9] = {2, 3, 5, 7, 11, 13, 17, 19, 23};
        memset(zhishu, 0,sizeof(zhishu));
        for(int i = 0; i < 9; i++){
            zhishu[nums[i]] = 1;
        }
    }
    int countPrimeSetBits(int left, int right) {
        init();
        int ret = 0;
        for(int i = left; i <= right; i++){
            int cnt = 0;
            int j = i;
            while(j > 0){
                j -= (j & (-j));
                cnt++;
            }
            if(zhishu[cnt]) ret ++;
        }
        return ret;
    }
};

 这个代码不算是很好  我看了一眼别人的题解 最优的方案是使用GCC的一个自带函数__builtin_popcount() 这个函数是直接求二进制数内有几个1 很方便 但是也有一个问题 这个函数只能在GCC内使用(如果我没记错的话)可能JAVA PYTHON会有更方便的扩展方法

有的话请告诉我, 互相学习!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值