📅  最后修改于: 2023-12-03 15:06:32.914000             🧑  作者: Mango
给定一个非负整数 N,找出所有从 0 到 N 的整数对,并计算每对数字的二进制中有多少个设置位。返回这些设置位的总和。例如,给定 N = 3,我们赋值:
所以从0到3的整数对的最大设置位计数,得出的总和为2。
我们可以使用位运算,循环从 0 到 N,计算每对数字中设置位的总和。 具体来说,我们可以遍历从 0 到 N,对于每个数字,我们可以使用 Brian Kernighan 的算法计算这个数字中设置位的数量,在相应计数器中增加该数量。 Brian Kernighan 的算法的基本思想是通过使用 $n&n-1$ 删除最低位上的 1,直到所有的 1 均已经被计算。例如,n &= n-1 可以将二进制中最低的一位修改为 0,这样,原始数字中设置位的总数就可以增加 1。
class Solution:
def countBits(self, num: int) -> List[int]:
res = [0] * (num+1)
for i in range(num+1):
count = 0
n = i
while n != 0:
count += 1
n &= n-1
res[i] = count
return res