【Python3】【力扣题】191. 位1的个数

 【力扣题】题目描述:

【Python3】【力扣题】191. 位1的个数_第1张图片

二进制“与”运算:(两个二进制中对应的每一位依次进行“与”运算)

1&1=1,0&1=0,0&0=0

【Python3】代码:

1、解题思路:整数转为二进制字符串,统计二进制字符串中“1”的个数。

知识点:bin(...):转为二进制字符串,即“0bxxx...”。

              str.count(“x”):统计x在字符串中有多少个。

class Solution:
    def hammingWeight(self, n: int) -> int:
        return bin(n).count("1")

2、解题思路:循环检查二进制位。

(2-1)依次将1的二进制左移和n的二进制每一位进行“与”运算,统计“与”运算结果为1的个数。【左移1的二进制】

知识点:range(32):从0到32的一个数组(含0不含32),即0、1、2...30、31。

               1 << i:将1的二进制左移i位。

               sum(...):求和。

               列表推导式:遍历列表,对各元素只有一行代码的简单操作,可简写:[ 元素操作 for 变量 in 列表 if 条件 ]。

class Solution:
    def hammingWeight(self, n: int) -> int:
        return sum(1 for i in range(32) if n & (1 << i))
        # 相当于
        alist = []
        for i in range(32):
            if n & (1 << i):
                alist.append(1)
        return sum(alist)

(2-2)将n的二进制位依次从低位到高位枚举每一位,和1的二进制进行“与”运算,统计“与”运算结果为1的个数。【右移n的二进制】

知识点:n & 1:获取二进制的最低位。n的二进制和1的二进制进行“与”运算。

              n >>= 1:n的二进制右移一位 ,并重新赋值给n。

class Solution:
    def hammingWeight(self, n: int) -> int:
        res = 0
        for i in range(32):
            if n & 1 == 1:
                res += 1
            n >>= 1
        return res

3、解题思路:位运算的优化。将n的二进制位从低位到高位依次将1消除成0,消除多少次则n的二进制中有多少个1。

知识点:n &= (n-1):n的二进制和n-1的二进制进行“与”运算,并重新赋值给n。结果是将n二进制最低位的1消除为0。

【Python3】【力扣题】191. 位1的个数_第2张图片

class Solution:
    def hammingWeight(self, n: int) -> int:
        res = 0
        while n:
            n &= n-1
            res += 1
        return res

你可能感兴趣的:(力扣题,leetcode,python)