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

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

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

例如, 21 的二进制表示 10101 有 3 个计算置位。
 

提示:

  • 1 <= left <= right <= 10^6
  • 0 <= right - left <= 10^4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/prime-number-of-set-bits-in-binary-representation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目有2个关键点:统计二进制表示中有几个1; 判断一个数是否为质数。

判断有几个1,可以用内置的bin().count(1)方法;

判断是否为质数,测试除数到开方+1 即可,不必遍历到数据本身。

1不是质数;2 是质数。

class Solution(object):
    def countPrimeSetBits(self, left, right):
        """
        :type left: int
        :type right: int
        :rtype: int
        """
        total = 0
        start = left
        while start <= right:
            num = self.count(start)
            # print(num)
            # if self.is_prime(num):#再优化,10的6 最多20个1, 也就是置位数最多为20,直接列出20以内的质数可以满足题目要求
            if num in {2, 3, 5, 7, 11, 13, 17, 19}:
                total += 1
            start += 1
        return total

    def count(self, number):
        return bin(number).count('1')#使用内置方法count 1更方便了
        # num = 0
        # for i in range(len(str(bin(number)))-2):
        #     if (number >> i) & 1 == 1:
        #         num += 1  
        # while number > 0:#需要继续优化,因为这样遍历需要遍历到0的位
        #     if number & 1 == 1:
        #         num += 1
        #     number >>= 1
        # while number:#每次消除一个最低位的1,只处理1的位,效率更高了
        #     num += 1
        #     number = number & (number-1)#重点在这里.是二进制运算了;与小于1的数相与,结果是消除最低位的一个1后的二进制表示;如果这个结果不是0 ,说明还是有1的位的,那就继续消1
        # return num

    def is_prime(self, number):
        if number == 1:
            return False
        if number == 2:
            return True
        # for i in range(2, number):#终止条件优化为开方+1
        for i in range(2, int(number*0.5)+1):

            if number%i == 0:
                return False
        return True

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值