剑指offer15:二进制中1的个数 python
题目描述

解法
1. 移位法
利用位的运算,比如
a = 0011 1100
那么位>>的运算为:
a >> 2
输出
0000 1111
将后面两位往后移,高位补0。
位运算符号&
a = 0011 1100
b = 000 1101
a&b = 000 1100
更多位运算符号可以看这里非常详细
利用上述特性我们可以写出:
class Solution:
def hammingWeight(self, n: int) -> int:
res = 0
while n:
res += n & 1 #最后一位与1做&操作,如果n当前位也为1,那么res+1
n >>= 1 # n后面两位去掉,并赋值给n
return res
时间复杂度O(N),空间复杂度O(1)
2. n&(n-1)法

每次用n&(n-1)直到n全为0
class Solution:
def hammingWeight(self, n: int) -> int:
res = 0
while n:
res += 1
n &= n-1
return res
时间复杂度O(M),因为指循环了M次(其中M为1的个数)
空间复杂度O(N),构造了新的n-1
3. 偷懒利用语言特性法
return bin(n).count('1')
思考感想
🤔🤔🤔这道题还是考符号运算,所以还是要熟悉一下之前的符号运算
本文深入解析剑指Offer15题目的三种解法:移位法、n&(n-1)法及利用Python语言特性的方法。通过对比分析,阐述各方法的时间和空间复杂度,帮助读者理解位运算在解决问题中的应用。

273

被折叠的 条评论
为什么被折叠?



