刷题模板之位运算——高频

使用  count+=   是因为什么?

338. 比特位计数 - 力扣(LeetCode)

我愿称这个高赞回答为神!!!

这段代码运用到了动态规划的思想来统计从 0 到 num 每个数的二进制表示中 1 的个数。
关键思路是使用了备忘录 result 数组来存储已经计算过的结果,每个新结果都可以基于已经得到的旧结果计算产生,这样避免重复计算。
具体分析:
1. base case 是 result[0] = 0,0 的二进制表示没有 1。
2. 对任意整数 i,如果是奇数,那么其 1 的个数是 i-1 的 1 个数再加 1。
3. 如果是偶数,那么其 1 的个数和 i/2 的 1 的个数相同。
4. 根据上述规律,逐步计算 result 数组中的每个元素值。
5. 最终 result 数组中的每个元素就是对应数字的 1 个数。
通过将大问题递归分解为小问题,并存储小问题的结果,最终可以合并出整体解,避免大量重复计算。

当然   算法通关村给出的解答则是更具代表性和普遍性。

这个模板所解决的问题是什么?

这一套模板,可以解决位运算中   统计1的数量的问题  (是不是也可以统计非1呢?)

190. 颠倒二进制位 - 力扣(LeetCode)

n >>= 1 这行代码的作用是将n的二进制表示向右移一位。
>= 是右移赋值运算符,它会将n的二进制表示向右移一位后赋值回n。
例如:
n = 5 = 0101 (二进制)
n >>= 1
n = 2 = 0010 (二进制)
可以看到,5的二进制表示向右移一位后变为2。
所以这行代码的作用是每次循环将n的二进制表示向右移一位,相当于除以2的作用,用于遍历取出n的每一位二进制数。
结合reversed += (n & 1) << power,整个循环逻辑是:
1. 取出n的最低位 (n & 1)
2. 将最低位左移power位后累加到reversed
3. n右移一位 (n >>= 1)
4. power减1
循环这个过程直到n变为0,这样可以逆转n的二进制位顺序,实现反转位功能。

面试题 08.05. 递归乘法 - 力扣(LeetCode)

这段代码实现了两个整数的乘法运算,利用了逐位判断和累加的方法。下面我举一个具体例子 walked =,同时详细解释运算过程:
假设 A = 5 (二进制 101),B = 3 (二进制 011)
1. 计算min和max: min取A和B中的较小值,所以min = 3; max取较大值,所以max = 5
2. ans初始化为0
3. 外层循环按min的位数进行,min初始为3,二进制位为011,所以循环3次
第1次循环:
- min & 1 = 1 (运算011与001)
- 由于min & 1 != 0, 执行ans += max, ans = 0 + 5 = 5 
- min右移一位,min = 1 (001)
- max左移一位,max = 10 (1010)
第2次循环:
- min & 1 = 1
- ans += max, ans = 5 + 10 = 15
- min右移一位,min = 0 (000)
- max左移一位,max = 20 (10100)
第3次循环:
- min & 1 = 0
- ans保持不变
- 循环结束
4. 返回最终的ans = 15
所以这个代码通过按位与和累加实现了两个整数的乘法,时间复杂度是O(n),n是最小整数的位数。

​​​​​​​这三条语句的顺序是有特定考虑的,主要原因是:
1. 先判断 min 的最低位是否为 1,如果是1则把 max 累加到 ans 中。
2. 然后将 min 右移一位,目的是取出下一位进行判断。
3. 最后将 max 左移一位,就是把 max 加倍。max 需要乘 2 的原因是,每判断一位,代表着 2 的一次方,如果该位是 1,需要把对应 2 的次方的 max 累加到 ans。
如果把语句顺序改变,就会影响正确的乘法计算:
1. 如果先让 min 右移,会导致还没判断最低位就失去了最低位信息。
2. 如果先让 max 加倍,在判断最低位时max的值就不正确了。
3. 必须先判断最低位,根据最低位来累加对应的 max,然后再右移和加倍。
所以这三条语句的顺序是经过考虑的,保证了正确的逻辑。这确保了每次判断 min 的位时,max 恰好是对应的 2 的幂次,这样累加结果才是正确的乘法计算结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值