Python程式設計題19--位元位計數
阿新 • • 發佈:2021-10-17
題目
給定一個整數 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
本文版權歸作者和部落格園共有,歡迎轉載,但必須在文章頁面明顯位置給出原文連結,並保留此段宣告,否則保留追究法律責任的權利。