LeetCode:191. 整数对应二进制中1的个数 - Python

191. 位1的个数

问题描述:

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

示例 1:

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

进阶:

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

问题分析:

前些时日,遇到的一个题目,现在总结一下,其中也是LeetCode上的一个题目,今天发现LeetCode上不区分Python版本了呀。方法有很多种,参考官方总结两个较优的方法。
(1)方法一:

一个无符号整数,在计算机中一般是由4个字节组成,1个字节8位,所以一种有32位。所以,我们可以用数字1去和每一位进行与操作(其实就用了32个数字,这些数字都是2n次方),很显然,如果这一位为1,那么结果一定为1,然后统计出来即可。

(2)方法二:

直接看图:
在这里插入图片描述

从上图可以看出来,每操作一次,就会从后面消除一个1,所以,可以循环这样的操作(统计循环了几次,就是1的个数),直到全为0结束。

Python3实现:

方法一:

class Solution(object):
    def hammingWeight(self, n):
        """
        :type n: int
        :rtype: int
        """
        cnt = 0  # 用于记录1的个数
        mask = 1  # 用于表示2的n次方,初始化为2的0次方

        for i in range(32):
            if n & mask != 0:  # 按位与操作
                cnt += 1
            mask <<= 1  # 左移一位,相当于乘以2

        return cnt

方法二:

class Solution(object):
    def hammingWeight(self, n):
        """
        :type n: int
        :rtype: int
        """
        cnt = 0  # 用于记录1的个数
        while n != 0:
            cnt += 1  # 计数
            n &= n - 1  # 按位与操作
        return cnt


if __name__ == '__main__':
    solu = Solution()
    print(solu.hammingWeight(110))

声明: 总结学习,有问题或不当之处,可以批评指正哦,谢谢。

题目链接参考链接

猜你喜欢

转载自blog.csdn.net/XX_123_1_RJ/article/details/86992436