题目链接: https://leetcode.cn/problems/number-of-1-bits/
视频题解: https://www.bilibili.com/video/BV1ir421M7XU/
LeetCode 191.位1的个数
题目描述
编写一个函数,输入是一个无符号整数 (以二进制串的形式),返回其二进制表达式中数字位数为 1
的个数(也被称为汉明重量)。
视频题解
位1的个数
思路来源
思路来源
思路解析
方法一
定义res
保存1
的个数。对于无符号整数n
,统计其中1
的个数步骤如下:
- 如果
n != 0
,n
对应二进制的最右边一位如果是1
,res++
,进入步骤2
。否则,返回res
。 - 把
n
对应的二进制向右移动一位,进入步骤1
。
关键在于如何获取n
对应二进制的最右边一位和怎样将n
对应的二进制向右移一位。
获取n对应二进制最右面一位有两种方式:
n
和1
进行与运算n & 1
可以获取n
对应二进制的最右面一位。n
对2
取余n % 2
即可获取n
对应二进制的最右面一位。
将n
对应的二进制右移一位有两种方式:
- 直接使用编程语言自带的右移符号,比如
c++
可以写为n >> 1
。 n / 2
也可以将n
对应的二进制右移一位。
C++代码
class Solution {
public:
int hammingWeight(uint32_t n) {
int res = 0;
while(n) {
//获取n对应二进制最右边一位
if (n % 2) {
++res;
}
//n对应的二进制右移一位
n = n / 2;
}
return res;
}
};
java代码
class Solution {
public int hammingWeight(int n) {
int res = 0;
while (n != 0) {
// 获取n对应二进制最右边一位
if (n % 2 == 1) {
res++;
}
// n对应的二进制右移一位
n = n / 2;
}
return res;
}
}
python代码
class Solution:
def hammingWeight(self, n: int) -> int:
res = 0
while n:
# 获取n对应二进制最右边一位
if n % 2:
res += 1
# n对应的二进制右移一位
n = n // 2
return res
方法二
定义res
保存1
的个数。对于无符号整数n
,统计其中1
的个数步骤如下:
- 如果
n != 0
,res++
,进入步骤2
。否则,返回res
。 n = n & (n - 1)
,进入步骤1
。
n & (n - 1)
其实就是将n
对应的二进制最右边值为1
的bit位
置为0
。
在纸上继续按照上面步骤模拟一遍,会帮助大家更好的理解。
C++代码
class Solution {
public:
int hammingWeight(uint32_t n) {
int res = 0;
while(n) {
++res;
//n对应二进制最右边不为零的bit位置为零
n = n&(n-1);
}
return res;
}
};
java代码
class Solution {
public int hammingWeight(int n) {
int res = 0;
while (n != 0) {
res++;
// n对应二进制最右边不为零的bit位置为零
n = n & (n - 1);
}
return res;
}
}
python代码
class Solution:
def hammingWeight(self, n: int) -> int:
res = 0
while n:
res += 1
# n对应二进制最右边不为零的bit位置为零
n = n & (n - 1)
return res
复杂度分析
时间复杂度: 两种方法都是O(1),因为二进制最长为32
位。
空间复杂度: 两种方法都是O(1),只使用了几个整型变量。