剑指 Offer 15. 二进制中1的个数(191. 位1的个数)

题目:

 

 

 

 

 

思路:

【1】由于输入的是int整数,那么其实并不一定要使用函数转成二进制的字符串,通过位移的方式一样可以达到像二进制一样的判断,但这里会有些问题,因为位移存在,左位移和右位移,首先左移的话是存在向末尾补0的操作,而右移的话,如果是正数,是会在高位补0,而负数则会补1。但基于条件给定正数,故都可以。

【2】消除二进制末尾的 1 的方法 【 n & (n - 1)】(这种无疑是最优的,有多少个1就循环多少次),原理:

 

代码展示:

//时间0 ms击败100%
//内存38.3 MB击败90.47%
//时间复杂度:O(k),其中 k 是 int 型的二进制位数,k=32。我们需要检查 n 的二进制位的每一位,一共需要检查 32 位。
//空间复杂度:O(1),我们只需要常数的空间保存若干变量
public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int count = 0;
        for (int i = 0; i < 32; i++){
            if (((n >> i) & 1) == 1) count++;
        }
        return count;
    }
}

//时间0 ms击败100%
//内存38.3 MB击败91.58%
public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int ret = 0;
        while (n != 0) {
            n &= n - 1;
            ret++;
        }
        return ret;
    }
}

 

posted @ 2023-02-16 16:26  忧愁的chafry  阅读(17)  评论(0编辑  收藏  举报