编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量) 。
示例1:
输入:n = 11 (控制台输入 00000000000000000000000000001011)
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。
示例2:
输入:n = 128 (控制台输入 00000000000000000000000010000000)
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 ‘1’。
示例3:
输入:n = 4294967293 (控制台输入 11111111111111111111111111111101,部分语言中 n = -3)
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 ‘1’。
方法一:调用bin() 计数
体现不出什么水平,可能 😢
class Solution:
def hammingWeight(self, n: int) -> int:
return bin(n).count('1')
中断补一下 位运算
方法二:逐位判断(1)
----来源
循环1<<i,可以得到只有从右边第i+1位是1的二进制串,再把每一个与n进行&操作,判断在第i+1位上是否为1,
- 时间复杂度:O(k), k有32位
- 空间复杂度:O(1)
class Solution:
def hammingWeight(self, n: int) -> int:
#1<<i 得到的是右边第i位为1,其他位都是0,与操作检测右i位是否为1
res = sum(1 for i in range(32) if n & (1 << i))
return res
方法三:逐位判断(2)
----来源
判断最右位为1的时候,计数加一,同时将n右移一位
class Solution:
def hammingWeight(self, n: int) -> int:
res = 0
while(n):
res += n & 1
n >>= 1
return res
方法四:巧用n&(n-1)
- (n−1) 解析: 二进制数字 n 最右边的 1 变成 0 ,此 1 右边的 0 都变成 1 。
- n&(n−1) 解析: 二进制数字 n 最右边的 1 变成 0 ,其余不变。
- 时间复杂度 :O(M) , M为二进制串中1的个数
- 空间复杂度 :O(1)
class Solution:
def hammingWeight(self, n: int) -> int:
res = 0
while n:
n &= n - 1
res += 1
return res