算法题分享 | 位1的个数

17 阅读2分钟

iPad壁纸🗓文字篇19_4_舞木子_来自小红书网页版.jpg

题目

给定一个正整数 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 在线编程学习平台,集在线做题、编程竞赛、即时通讯、文章创作、视频教程、技术论坛为一体

公众号

有兴趣可以关注公众号一起学习更多的干货哈!

扫码_搜索联合传播样式-白色版.png