题目如下:
请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 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;
}
}