1. 程式人生 > 實用技巧 >LeetCode 338. 位元位計數

LeetCode 338. 位元位計數

給定一個非負整數 num。對於 0 ≤ i ≤ num 範圍中的每個數字 i ,計算其二進位制數中的 1 的數目並將它們作為陣列返回。

示例 1:

輸入: 2
輸出: [0,1,1]
示例 2:

輸入: 5
輸出: [0,1,1,2,1,2]
進階:

給出時間複雜度為O(n*sizeof(integer))的解答非常容易。但你可以線上性時間O(n)內用一趟掃描做到嗎?
要求演算法的空間複雜度為O(n)。
你能進一步完善解法嗎?要求在C++或任何其他語言中不使用任何內建函式(如 C++ 中的 __builtin_popcount)來執行此操作。

class Solution:
    def countBits(self, num: int) -> List[int]:
        """
        i    bin       '1'    i&(i-1)
        0    0000    0
        -----------------------
        1    0001    1    0000
        -----------------------
        2    0010    1    0000
        3    0011    2    0010
        -----------------------
        4    0100    1    0000
        5    0101    2    0100
        6    0110    2    0100
        7    0111    3    0110
        -----------------------
        8    1000    1    0000
        9    1001    2    1000
        10   1010    2    1000
        11   1011    3    1010
        12   1100    2    1000
        13   1101    3    1100
        14   1110    3    1100
        15   1111    4    1110
        
        i&(i-1) 可以用來判斷是否是2的指數
        """
        ans=[0]*(num+1)
        for i in range(1,num+1):
            ans[i] = ans[i&(i-1)]+1
        return ans