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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章