分奇偶数
偶数的二进制1个数超级简单,因为偶数是相当于被某个更小的数乘2,乘2怎么来的?在二进制运算中,就是左移一位,也就是在低位多加1个0,那样就说明dp[i] = dp[i / 2]
奇数稍微难想到一点,奇数由不大于该数的偶数+1得到,偶数+1在二进制位上会发生什么?会在低位多加1个1,那样就说明dp[i] = dp[i / 2] + 1
class Solution:
def countBits(self, n: int) -> List[int]:
res = [0] * (n + 1)
for i in range(n + 1):
if i % 2 == 0:
res[i] = res[i >> 1]
else:
res[i] = res[i >> 1] + 1
# 暴力法:每个数字转化为二进制,过程中统计1的个数
# cnt = 0
# while i:
# if i % 2 != 0:
# cnt += 1
# i = i >> 1
# res.append(cnt)
return res