剑指Offer——15. 二进制中 1 的个数

题目如下:

请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。

示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。

示例 2:
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 ‘1’。

示例 3:
输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 ‘1’。

提示:
输入必须是长度为 32 的 二进制串 。


自己的算法及代码(运行结果错误)

把 n 转成 String 类型,然后依次处理其中的每个字符,统计 1 的个数。
(这样的结果不对,但目前还不知道这个思路错在哪里了)

public class Solution {
    
    

    public static int hammingWeight(int n) {
    
    
        int count = 0;
        String str = String.valueOf(n);
        for (int i = 0; i < str.length(); i++){
    
    
            char c = str.charAt(i);
            if (c == '1'){
    
    
                count++;
            }
        }
        return count;
    }

    public static void main(String[] args) {
    
    
        int num = Integer.parseInt("00000000000000000000000000001011");
        int result = hammingWeight(num);
        System.out.println(result);
    }
}


参考的算法及代码:

算法思路

  • 初始化数量统计变量 res
  • 循环消去最右边的 1 :当 n = 0 时跳出。
    res += 1 : 统计变量加 1 ;
    n &= n - 1 : 消去数字 n 最右边的 1 。
  • 返回统计数量 res

  • (n−1) 解析: 二进制数字 n 最右边的 1 变成 0 ,此 1 右边的 0 都变成 1 。
  • n & (n - 1) 解析: 二进制数字 n 最右边的 1 变成 0 ,其余不变。
    在这里插入图片描述

该算法执行过程示例

  • n = 10101000 为例,代码执行过程如下:
    在这里插入图片描述

代码如下

public class Solution {
    
    
    public int hammingWeight(int n) {
    
    
        int res = 0;
        while(n != 0) {
    
    
            res++;
            n &= n - 1;
        }
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/pary__for/article/details/114366062