编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数。
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
解1:
1<<0 = 1(0001)
1<<1 = 2(0010)
1<<2 = 4(0100)
当检查第i位时,将输入num与2^i进行与运算,当num的第i位为1时,运算结果>0
func hammingWeight(num uint32) int {
ans := 0;
for i := 0; i < 32; i++{
if 1<<i&num > 0{
ans ++;
}
}
return ans
}
时间复杂度 O(k), k=num的长度 32
空间复杂度 O(1)
解2:
利用n&(n-1),其运算结果正好把n的二进制最低位1变成0
100(0110 0100)
99 (0110 0011)
100&(100-1)=(0110 0000)=96,运算结果把100的二进制最低位1变成0
不断让当前的 n与n-1做与运算,直到n变为0即可。
因为每次运算会使得n的最低位的1被翻转,因此运算次数就等于n的二进制位中 1 的个数。
func hanmmingWeight(num uint32) int{
ans := 0
for ; num > 0; num&=num-1{
ans++
}
return ans
}
时间复杂度 O(logn),循环次数是n二进制1的个数,最坏情况n的二进制位都是1
空间复杂度 O(1)