5

LeetCode 图解 | 191.位 1 的个数

 2 years ago
source link: https://www.cxyxiaowu.com/8315.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
191.位 1 的个数-五分钟学算法
当前位置:五分钟学算法 > LeetCodeAnimation > LeetCode 图解 | 191.位 1 的个数

点击上方蓝字设为星标LeetCode 图解 | 191.位 1 的个数

下面开始今天的学习~

LeetCode 图解 | 191.位 1 的个数

今天分享的题目来源于 LeetCode 上第 191 号问题:位 1 的个数。

编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。

  • 在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3

进阶:
如果多次调用这个函数,你将如何优化你的算法?

该题比较简单,解法有挺多,有位移法、位操作法、查表法、二次查表法等方法。

观察一下 n 与 n-1 这两个数的二进制表示:对于 n-1 这个数的二进制来说,相对于 n 的二进制,它的最末位的一个 1 会变成 0,最末位一个 1 之后的 0 会全部变成 1,其它位相同不变。

比如 n = 8888,其二进制为 10001010111000

则 n – 1 = 8887 ,其二进制为 10001010110111

通过按位与操作后:n & (n-1) = 10001010110000

也就是说:通过 n&(n-1)这个操作,可以起到 消除最后一个1 的作用。

所以可以通过执行 n&(n-1) 操作来消除 n 末尾的 1 ,消除了多少次,就说明有多少个 1 。 

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int cnt = 0;
        while(n > 0){
            cnt++;
            n = n & (n - 1);
        }
        return cnt;
    }
};

复杂度分析

  • 时间复杂度:O(k)。

  • 空间复杂度:O(1)。

相关题目推荐

  • LeetCode 190:颠倒二进制位

  • LeetCode 231:2 的幂

LeetCode 图解 | 191.位 1 的个数

原文始发于微信公众号(图解面试算法):LeetCode 图解 | 191.位 1 的个数


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK