前 n 个数字二进制中 1 的个数
题目
输入: n = 2
输出: [0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10
解法
1.位运算小技巧
关键点:i & i-1: 去掉低位的一个1
比特位计数:(k&=(k-1)实现去掉右边的1)。设 ( n u m ) 2 (num)_2 (num)2表示num数字得二进制表示。
比如,
9
=
(
1001
)
2
9 = (1001)_2
9=(1001)2
k & k-1 =
(
1001
)
2
(1001)_2
(1001)2&
(
1000
)
2
(1000)_2
(1000)2 =
(
1000
)
2
(1000)_2
(1000)2
k > k & k-1,因此 当前的结果由过去结果可以直接得出。
也就是
k位置上的1的个数 = k & k-1位置上的1的数目 + 1
class Solution:
def countBits(self, n: int) -> List[int]:
res = [0]*(n+1)
for i in range(1, n+1):
res[i] = res[i&(i-1)]+1
return res
2 .内置方法:bin(int)方法
class Solution:
def countBits(self, n: int) -> List[int]:
res = []
for i in range(n+1):
res.append(bin(i)[2:].count('1'))
return res
课外话
计算n的二进制数的1的个数
count = 0
while n:
n = n & n-1
count += 1
找到n的二进制位为1的比特位
n&1表示取n二进制右起第一位(最低位)
bit = 0
while n:
if n & 1:
print(bit)
bit += 1
n >>= 1
找到n的第一位为1的表示低位数
比如 01010 & 10110 => 10 => 2
010100 & 101100 => 100 => 8
n & -n