leetcode191,位1的个数

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '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)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容