leetcode 338. 比特位计数

leetcode 338. 比特位计数

给定一个非负整数num。对于0 ≤ i ≤ num 范围中的每个数字i,计算其二进制数中的 1 的数目并将它们作为数组返回。

示例 1:

输入: 2

输出: [0,1,1]

示例2:

输入: 5

输出: [0,1,1,2,1,2]

leetcode 338

思路

最高有效位
1 0001
2 0010
3 0011

4 0100

5 0101 = 4 + 1 = 0100 + 0001
6 0110 = 4 + 2 = 0100 + 0010
7 0111 = 4 + 3 = 0100 + 0011

代码

    def countBits(self, num: int) -> List[int]:
        dp = [0] * (num + 1)
        n = 1
        while n <= num:
            dp[n] = 1
            n <<= 1
        k = 0
        for i in range(1, num + 1):
            if dp[i] == 1:
                k = i
            else:
                dp[i] = dp[k] + dp[i-k]
        return dp

最低有效位
1 0001
2 0010 = (2 >> 1) = 1
3 0011 = 2 + 1
4 0100 = (4 >> 1) = 0010 = 2
5 0101 = 4 + 1
6 0110 = (6 >> 1) = 0011 = 3
7 0111 = 6 + 1
8 1000 = (8 >> 1) = 0100 = 4
9 1001 = 8 + 1
10 1010 = (10 >> 1) = 0101 = 5
11 1011 = 10 + 1

    def countBits(self, num: int) -> List[int]:
        dp = [0] * (num + 1)
        for i in range(1, num + 1):
            if i & 1:
                dp[i] = dp[i - 1] + 1
            else:
                dp[i] = dp[i >> 1]
        return dp

补充:获取二进制1的个数

    def popcount(self, num: int) -> int:
        count = 0
        while num:
            num &= (num - 1)
            count += 1
        return count
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值