剑指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')
思考感想
🤔🤔🤔这道题还是考符号运算,所以还是要熟悉一下之前的符号运算