给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
示例 1:
输入: 2
输出: [0,1,1]
示例 2:
输入: 5
输出: [0,1,1,2,1,2]
思路:先建立一个哈希表dic,用来记录每个数对应比特位为1的数量,之后设立一个pre并对每个数i和它前一个数i-1进行按位与运算,如果结果为0,则说明两个数的比特位没有重复项,直接计算就可;但如果不为0,说明有重复项,也就是说某个数i去掉最高位1构成的数pre在之前被访问过,这时count=1+dic[i-pre],例如:当前i=3,二进制位0011,i-1=2,二进制位0010,前面算出来dic[1]=1,此时的pre=2,count=1+dic[3-,2] = 2,完成计算
代码:
class Solution:
def countBits(self, num: int) -> List[int]:
if num == 0:
return [0]
res = [0]
dic = {0: 0}
for i in range(1, num+1):
if i & (i-1) == 0:
pre = i # pre用来记录当前的数
count = 1
else:
count = 1 + dic[i - pre]
dic[i] = count
res.append(count)
return res
题目来自LeetCode第338题