leetcode 338. 比特位计数
给定一个非负整数num。对于0 ≤ i ≤ num 范围中的每个数字i,计算其二进制数中的 1 的数目并将它们作为数组返回。
示例 1:
输入: 2
输出: [0,1,1]
示例2:
输入: 5
输出: [0,1,1,2,1,2]
思路
最高有效位
1 0001
2 0010
3 0011
4 0100
5 0101 = 4 + 1 = 0100 + 0001
6 0110 = 4 + 2 = 0100 + 0010
7 0111 = 4 + 3 = 0100 + 0011
…
代码
def countBits(self, num: int) -> List[int]:
dp = [0] * (num + 1)
n = 1
while n <= num:
dp[n] = 1
n <<= 1
k = 0
for i in range(1, num + 1):
if dp[i] == 1:
k = i
else:
dp[i] = dp[k] + dp[i-k]
return dp
最低有效位
1 0001
2 0010 = (2 >> 1) = 1
3 0011 = 2 + 1
4 0100 = (4 >> 1) = 0010 = 2
5 0101 = 4 + 1
6 0110 = (6 >> 1) = 0011 = 3
7 0111 = 6 + 1
8 1000 = (8 >> 1) = 0100 = 4
9 1001 = 8 + 1
10 1010 = (10 >> 1) = 0101 = 5
11 1011 = 10 + 1
…
def countBits(self, num: int) -> List[int]:
dp = [0] * (num + 1)
for i in range(1, num + 1):
if i & 1:
dp[i] = dp[i - 1] + 1
else:
dp[i] = dp[i >> 1]
return dp
补充:获取二进制1的个数
def popcount(self, num: int) -> int:
count = 0
while num:
num &= (num - 1)
count += 1
return count