from typing import List
# 338比特位计数,可以通过三种方法来做。
# 第一种:暴力法,一边循环遍历,然后求出每个数字转化为二进制的1的个数。
# 第二种:递归法,但是需要递归的过程中将结果记录下来,使用数组将每次计算的结果存起来。
# 第三种方法和第二种类似,都是使用数组将之前算的结果存储下来,供当前数字调用。
class Solution:
def countBits1(self, num: int) -> List[int]:
if num < 0:
return []
num //= 1
res = []
# 直接循环,二进制转换,然后统计1的个数。
for i in range(num + 1):
res.append(bin(i).count('1'))
return res
def countBits2(self, num: int) -> List[int]:
self.res,self.cur_list = [],[]
# 循环调用函数,
for i in range(num + 1):
self.res.append(self.count_1(i))
return self.res
def count_1(self,num):
if num == 0:
res = 0
elif num % 2 == 1:
res = self.cur_list[num // 2] + 1
elif num % 2 == 0:
res = self.cur_list[num // 2]
self.cur_list.append(res)
return res
def countBits3(self, num: int) -> List[int]:
self.res = [0] * (num + 1)
for i in range(num + 1):
self.res[i] = self.res[i >> 1] + (i & 1)
return self.res
A = Solution()
print(A.countBits(4))