day18 JZ15 二进制中1的个数(Java)

104 阅读2分钟

题目来源: JZ15 二进制中1的个数

题目描述:

  • 描述: 输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。 数据范围:  −2^31<=n<=2^31−1,即范围为:−2147483648<=n<=2147483647
示例1:
输入:10
返回值:2
说明:十进制中10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010,其中有两个1。
示例2:
输入:{67,0,24,58}
返回值:[58,24,0,67]
说明:负数使用补码表示 ,-1的32位二进制表示为1111 1111 1111 1111 1111 1111 1111 1111,其中32个1 

思路

我们可以检查该数字的二进制每一位是否为1,如何遍历二进制每一位呢?可以考虑移位运算,每次移动一位就可以。至于怎么统计到1呢?我们都只知道数字1与数字相位与运算,其实只是最后一位为1就是1,最后一位为0就是0,这样我们只需要将数字1移位运算,就可以遍历二进制的每一位,再去做位与运算,结果为1的就是二进制中为1的。

具体实现:

public class Solution {
    public int NumberOf1(int n) {
        int res = 0;
        //遍历32位
        for(int i = 0; i < 32; i++){
            //按位比较
            if((n & (1 << i)) != 0)   
                res++;
        }
        return res;
    }
}

复杂度分析:

  • 时间复杂度:O(k),k为int型的32位,一次遍历
  • 空间复杂度:O(1),常数级变量,没有额外辅助空间