菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
346
0

338. 比特位计数

原创
05/13 14:22
阅读数 34597

338. 比特位计数

1. 直接计算

  • 按位与运算(&)的一个性质是:对于任意整数 x,令 x=x &(x-1),该运算可以将 x 的二进制表示的最后一个 1 变成 0。

  • 对 x 重复该操作,直到 x 变成 0,可以统计出x的二进制表示中有多少1,原理分析如下:

    • 设x的二进制表示为[x0, x1, ..., xn],其中数值为1的最低位为m。
    • (x-1)相当于[x0,...,xm+1]保持不变,[xm,...,xn]按位取反。
    • x&(x-1)相当于[x0,...,xm+1]保持不变,[xm,...,xn]全部变为0。
    • 以上三个步骤循环进行,只到所有数位变为0,循环次数即为1的个数。
class Solution:
    def countBits(self, num: int) -> List[int]:
       
        def countOnes(x):
            ones = 0
            while x > 0:
                x &= (x-1)
                ones += 1
            return ones 

        results = [countOnes(i) for i in range(num+1)]
        return results

2. 动态规划-最高有效位

  • 对于正整数 x,如果可以知道最大的正整数 y,使得 y≤x 且 y 是 2 的整数次幂,则 y 的二进制表示中只有最高位是 1,其余都是 0,此时称 y 为 x 的最高有效位,并且有bits[x] = bits(x-y) + bits(y) = bits(x-y) + 1
  • 如果正整数 y 是 2 的整数次幂,则 y 的二进制表示中只有最高位是 1,其余都是 0,因此 y &(y-1)=0。由此可见,正整数 y 是 2 的整数次幂,当且仅当 y &(y-1)=0。
  • 算法:遍历从 1到 num 的每个正整数 i,进行如下操作
    • 如果 i &(i-1)=0,则令bits[i]=1且highbit=i,更新当前的最高有效位。
    • 如果 i &(i-1)!=0,bits[i]=bits[i-highbit]+h[highbit]=bits[i-highbit]+1
class Solution:
    def countBits(self, num: int) -> List[int]:
        results = [0]
        highbit = 0
        for i in range(1, num+1):
            if i&(i-1)==0:
                results.append(1)
                highbit = i
            else:
                results.append(results[i - highbit] + 1)       
        return results

发表评论

0/200
346 点赞
0 评论
收藏