1. 程式人生 > 其它 >Python程式設計題19--位元位計數

Python程式設計題19--位元位計數

題目

給定一個整數 n ,對於 0 ≤ i ≤ n 中的每個 i ,計算其二進位制表示中 1 的個數並把它們返回。

例如:

給定一個整數:n = 2,返回結果:[0, 1, 1]

給定一個整數:n = 5,返回結果:[0, 1, 1, 2, 1, 2]

n的範圍說明:0 ≤ n ≤ 10^5

實現思路1

  • 設定一個列表res,用於儲存 0 ≤ i ≤ n 中的每個 i 對應二進位制數中1的個數
  • 遍歷1到n+1,利用 Python 裡的內建函式 bin() 把 i 轉換為字串格式的二進位制數,比如 8 轉為二進位制數為 0b1000
  • 利用 Python 裡的內建函式 count() 統計字串中出現1的次數,並依次把出現次數新增到res中,最後進行返回

程式碼實現

def countBits(n):
    res = [0]
    for i in range(1, n + 1):
        res.append(bin(i).count("1"))
    return res

實現思路2

  • 針對二進位制數,左移一位,代表乘以2;右移一位,代表除以2;
  • 對於偶數 i ,其二進位制數最低位肯定為0,所以其二進位制數整體向右移動一位後並不會影響1的個數。其二進位制中1的個數,也就肯定等於 i // 2
    所對應的二進位制數中1的個數;
  • 對於奇數 i ,其二進位制數最低位肯定為1,其二進位制中1的個數,也就肯定等於前一個數中1的個數再加1

程式碼實現

def countBits(n):
    res = [0]
    for i in range(1, n + 1):
        if i % 2 != 0: 
            res.append(res[i - 1] + 1)
        else: 
            res.append(res[i // 2])
    return res

實現思路3

我們還可以利用 Python 裡的 位運算子 來實現,其大致與實現思路2的邏輯一致,但通過位運算子,我們可以讓程式碼更簡化。

  • & 按位與運算子:參與運算的兩個二進位制數, 如果兩個相應位都為1, 則該位的結果為1, 否則為0;
  • >> 右移動運算子:如 i >> 1,表示將 i 對應的二進位制數整體右移一位,其實也就相當於 i // 2
  • 如果 i 為偶數,其二進位制數最低位肯定為0,所以 i & 1 的結果必為 0;
  • 如果 i 為奇數,其二進位制數最低位肯定為1,所以 i & 1 的結果必為 1。

程式碼實現

def countBits(n):
    res = [0]
    for i in range(1, n + 1):
        res.append(res[i >> 1] + (i & 1))
    return res
作者:wintest 出處:https://www.cnblogs.com/wintest 本文版權歸作者和部落格園共有,歡迎轉載,但必須在文章頁面明顯位置給出原文連結,並保留此段宣告,否則保留追究法律責任的權利。