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

题目说明

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

  • 提示:

    • 输入必须是长度为 32二进制串

示例

示例 1:

1
2
3
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

示例 2:

1
2
3
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。

示例 3:

1
2
3
输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。

笔者理解

此题是一道位运算算法问题,在力扣题库中被定义为简单题。

解法

当笔者阅读完此题后,发现此题是比较简单的位运算题目,让我们来看看具体如何实现的吧。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Solution {
/*
* 位运算
*/
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int result = 0;
// 消除二进制数尾位1来计算二进制数中1的个数
while(n != 0) {
n &= (n - 1);
result++;
}
return result;
}
}

时间效率和空间效率都还行,可见此解法还比较适合此题;

image-20210623145317709

总结

本题是今天的每日一题,难度是为简单,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。