題目
給定一個整數 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