簡體   English   中英

如何統計數字的總設置位數

[英]How to count the total number of set bits for the number

  • 給定一個正數 integer A,任務是計算從 1 到 A 的所有數字的二進制表示中設置位的總數。
 A = 3
 DECIMAL    BINARY  SET BIT COUNT
    1          01        1
    2          10        1
    3          11        2

1 + 1 + 2 = 4

  • 我得到正確的 output

代碼如下

def solve(A):
     ad = ''
     for i in range(A + 1):
         ad += str(bin(i).replace('ob',''))
     return ad.count('1')

按位

  def solve(A):
        count = 0
        for i in range(A + 1):
            while i > 0:
                i= i & (i-1)
                count += 1
        return (count)
  • 在這兩種情況下,我都Time Limit Exceeded.

這將在 O(log(A)) 中工作,所以你不應該超過時間限制:

def solve(A):
  count = 0
  n = A
  i = 0
  while n > 0:
    if (n & 1) == 1:
      f = ((1 << i) >> 1) * i
      g = (((1 << i) - 1) & A) + 1
      count += f + g
    n >>= 1
    i += 1
  return count

排除在 0 和 2^n 之間的設置位總數為 2^(n-1)*n。 因為在這種特殊情況下,每列中設置了 50% 的位,其他 50% 未設置,並且有 n 列。

對於不是 2 的冪的數字 A,我們可以將計算分解為幾遍,一次針對所討論的數字 A 中的每個設置位,並使用 2 的精確冪(變量 f)的表達式。 我們還必須每次都處理一個額外的 1 列(變量 g)。

架構以了解其工作原理

我當時正在研究一種類似於 covstag 的解決方案,但我計算 2 的冪的位總和的方法肯定比較笨拙。 所以我偷了這個想法並將其改編為我的解決方案; 結果只是稍微快一點,但也許更容易理解:

def solve(A):
    loop = 0
    current = 0
    bits = f'{A:b}'
    expo = len(bits) - 1
    for b in bits[:-1]:
        if b == '1':
            power = 2**(expo-1)
            current += expo * power + 1 + 2 * power * loop
            loop += 1
        expo -= 1
    if bits[-1] != '0':
        current += loop + 1
    return current

這會起作用:

def solve(A):
    return sum(int(b) for n in range(1, A + 1) for b in f"{n:b}" if b == '1')

這是另一種非常經典的方式:

def solve(A):
    result = 0
    for n in range(1, A + 1):
        while n > 0:
            result += n % 2
            n //= 2
    return result 

在您的第一個解決方案中,您可以稍微改進一下:

def solve(A):
    result = 0
    for i in range(A + 1):
         result += bin(i).count('1')
    return result

甚至

def solve(A):
    return sum(bin(i + 1).count('1') for i in range(A))

這與我的第一次嘗試相似,甚至可能更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM