题目
给定一个正整数 n
,编写一个函数,获取一个正整数的二进制形式并返回其二进制表达式中 设置位 的个数(也被称为汉明重量)。
示例 1:
输入: n = 11
输出: 3
解释: 输入的二进制串 1011 中,共有 3 个设置位。
示例 2:
输入: n = 128
输出: 1
解释: 输入的二进制串 10000000 中,共有 1 个设置位。
示例 3:
输入: n = 2147483645
输出: 30
解释: 输入的二进制串 1111111111111111111111111111101 中,共有 30 个设置位。
提示:
1 <= n <= 231 - 1
进阶:
- 如果多次调用这个函数,你将如何优化你的算法?
题解
解题思路
这道题比较简单,最直接的思路是使用位运算解决,由于 1 <= n <= 231 - 1
,所以数一共有 32 位二进制位,逐位判断是否是 1 统计 1 的个数即可。
但是还可以进一步优化
可以利用一个规律,n & (n-1) 的值等于把 n 的二进制数中值为 1 的最低位改为 0 的结果,所以我们只需要不断执行 n &= (n-1),直到 n 的值为 0,每执行一次,执行的次数即为 n 中值为 1 的位数。 这样在时间复杂度上有了较大的优化。
代码
class Solution {
public int hammingWeight(int n) {
int ans = 0;
while(n != 0) {
n &= n - 1;
ans++;
}
return ans;
}
}
复杂度分析
- 时间复杂度:O(log n)
循环的次数为 n 二进制中 1 的个数,最坏情况是全为 1。 - 空间复杂度:O(1)
优质项目推荐
推荐一个可用于练手、毕业设计参考、增加简历亮点的项目。
lemon-puls/txing-oj-backend: Txing 在线编程学习平台,集在线做题、编程竞赛、即时通讯、文章创作、视频教程、技术论坛为一体
公众号
有兴趣可以关注公众号一起学习更多的干货哈!