给你两个整数 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