开学感觉已经是遥遥无期了
我的论文啊
我的工作啊
我该如何抉择!
题目描述:
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
示例 1:
输入: 2
输出: [0,1,1]
示例 2:
输入: 5
输出: [0,1,1,2,1,2]
思路解析:
这一题是动态规划题目,但是状态转移方程真的不是那么好找的。这个确实是得对数字比较敏感的人才好找。我下面可以举几个例子吧。
0 -> "0", 2 -> "10", 4 -> "100", 8->"1000"
1 _> "1", 3 -> "11", 7 -> "111", 15 -> "1111"
大家可以看到,每个数之间都是依次递增一个“1”数字,更严格的说,就是左边补上一个“1”了。而且上下两列的差值都是一样,为2, 4, 8...增加。这其实就是2的几次方依次增加。由此,我们可以写出此题的状态转移方程,如下所示:
代码如下:
class Solution(object):
def countBits(self, num):
"""
动态回归方法
:type num: int
:rtype: List[int]
"""
bit_list = [0]*(num+1)
b = 1
while b <= num:
for i in range(b):
if b+i > num:
break
bit_list[b+i] = bit_list[i] + 1
b <<= 1
return bit_list
if __name__ == "__main__":
num = 4
print(Solution().countBits(num))
执行效率在90%左右,挺可以的。