hw10(第九周)

LeetCode 338 (Counting Bits)

思路:
如果已知0到2^k - 1之间的所有数的比特计数,那么2^k到2^(k+1) - 1之间的所有数的比特计数就可以推导出来:bit [ i + 2^k ] = bit [ i ] + 1,其中0 <= i < 2^k.
因为bit [ i + 2^k ]的前k位与bit [ i ]相同,只是第k+1位由0变成了1.

如:
0 =   0, 1 =   1,
2 = 10, 3 = 11.
k=0时,bit[1]=bit[0]+1.
k=1时,bit[2]=bit[0]+1, bit[3]=bit[1]+1.

这样一来,只要知道bit[0]=0,那么就可以求出任意一个数的比特计数。

代码:

class Solution:
    def countBits(self, num):
        """
        :type num: int
        :rtype: List[int]
        """
        if num == 0:
            return [0]
        ans = [0, 1]
        n = 2
        while n <= num:
            for i in range(0, n):
                ans.append(ans[i] + 1)
            n <<= 1
        return ans[:num + 1]

猜你喜欢

转载自blog.csdn.net/weixin_38533133/article/details/80180231
今日推荐