【问题标题】:Python: Trying to Count Number of 1 Bits in an Integer But Missing One 1Python:尝试计算整数中 1 的位数但缺少一个 1
【发布时间】:2022-11-10 12:53:24
【问题描述】:
Input: n = 00000000000000000000000000001011
Output: 3
Explanation: The input binary string 00000000000000000000000000001011 has a total of three '1' bits.

当我在下面运行我的代码时,似乎只有两个 1 被识别......为什么会这样?

class Solution(object):
    def hammingWeight(self, n):
        """
        :type n: int
        :rtype: int
        """
        
        sum = 0
        
        for i in str(n):
            sum += int(i)
            
        return sum 

我想我在这里误解了一些概念。希望得到一些指导。

【问题讨论】:

  • 如果您将print(n)print(str(n)) 添加到您的代码中,您会看到什么?这是否为您提供了有关您的解决方案有什么问题的线索?提示:print()str() 使用什么基础来转换 int 以进行显示?
  • 二进制数 0b1011 是基数为 10 的 11。整数n是11。如果你取以10为底的整数11,把它变成一个字符串,数1,有两个1。
  • @PineNuts0 有几种方法可以做到这一点,最简单的可能是使用 bin 将 base-10 整数转换为 base-2 表示,并计算结果字符串中的 1。
  • @PaulM。不,看起来像 LeetCode,它有 Python 3.10。
  • @KellyBundy 我不清楚,你以为我是什么意思?

标签: python function count bit


【解决方案1】:

Python 3.10 引入了 int.bit_count() 但如果你必须自己实现算法,那么你可以尝试这样的事情:

测试.py:

def count(n):
    bits = 0

    while n:
        bits += 1
        n &= n - 1

    return bits


def main():
    n = 0b110001010000000000111
    c = count(n)

    print(f"Bit length: {n.bit_length()}, bits: {c}")


if __name__ == "__main__":
    main()

测试:

$ python test.py
Bit length: 21, bits: 7

该算法的时间复杂度为O(k),其中k 是设置为1 的位数。

【讨论】:

  • “O(k)”有点像我的头脑中无法做出的分析。如果你假设 n 是一个固定大小的 int,你可以说它是 O(1),如果你假设它是任意大小,那么你不是 O(k),而是 O(k log n)。
  • 我不同意,即使使用固定大小的 int 也不需要固定数量的步骤,例如 0b111111110b10000000
  • 我没有说它需要固定数量的步骤。这不是 O(1) 的意思。这意味着它是有界的由一个常数,而且只是从某个时刻开始。您将 ≤ 与 = 混淆,将 n₀ 与 0 混淆。
【解决方案2】:

str(n) 更改为bin(n)[2:]。这样,您将获得n 的二进制表示字符串,省略了“0b”前缀。

顺便说一句,您不需要在循环中手动计数。 Python 字符串有.count()

return bin(n).count("1")

【讨论】:

    猜你喜欢
    • 2019-03-12
    • 1970-01-01
    • 2022-12-30
    • 2022-01-19
    • 1970-01-01
    • 2021-06-30
    • 2017-10-20
    • 2020-10-19
    • 1970-01-01
    相关资源
    最近更新 更多