leetcode 338 位元位計數

2021-10-08 20:54:15 字數 1710 閱讀 2351

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

示例 1:

輸入: 2

輸出: [0,1,1]

示例 2:

輸入: 5

輸出: [0,1,1,2,1,2]

高階:

class solution(object):

def countbits(self, num):

""":type num: int

:rtype: list[int]

"""def countb(num):

count = 0

while num:

if num & 0x1 :

count += 1

num = num >> 1

return count

res =

for i in range(num+1):

count = countb(i)

return res

對每個數進行移位判斷。判斷乙個二進位制數有多少個1,只需要不斷將二進位制數右移並且判斷其末位是否為1就行,判斷其末位是否為1需要用到&運算子,任何數與1的二進位制的與的結果可以得出其末位是否為1。

class solution(object):

def countbits(self, num):

""":type num: int

:rtype: list[int]

"""def countb(num):

count = 0

while num:

count += 1

num &= num-1

return count

res =

for i in range(num+1):

count = countb(i)

return res

對二進位制中1的個數的判斷方法我們進行了進一步的改進。考慮乙個非0的二進位制數10100,我們可以看到其末尾是兩個0,然後一共有兩個位是1。當我們對其減1時,會發現它最後一位的1變成了0,整個數變成了10011,然後進行&操作,後面都會變成0,只剩下前面的部分,10100 & 10011 =10000。所以最後的時間複雜度和1的位數有關,而不需要sizeof(integer)的操作次數了。

class solution:

def countbits(self, num):

dp=[0]*(num+1)

for i in range(1,num+1):

if(i%2==1):

dp[i]=dp[i-1]+1

else:

dp[i]=dp[i//2]

return dp

可以根據奇偶性來判斷其位為1的個數。

如果乙個數是奇數,那麼它的末位是1,它的1總個數是和前乙個偶數有關的,比前乙個偶數多一。例如3 (11),前乙個偶數是2 (10),可以很直觀的發現奇數就比比他小的偶數多乙個1。

如果是乙個偶數,那麼它的末位是0,那麼將它右移一位得到的數應該是和原數有一樣的1的個數。所以偶數的1位個數和它除以2之後得到的數是一樣的。例如 4(100)和2(10)。

leetcode 338 位元數計位

給定乙個非負整數 num。對於 0 i num 範圍中的每個數字 i 計算其二進位制數中的 1 的數目並將它們作為陣列返回。示例 1 輸入 2 輸出 0,1,1 示例 2 輸入 5 輸出 0,1,1,2,1,2 高階 思路 對於任意乙個十進位制數來說,有兩種情況。1 奇數,當乙個數為奇數的時候,它對...

leetcode338 位元位計數

給定乙個非負整數 num。對於 0 i num 範圍中的每個數字 i 計算其二進位制數中的 1 的數目並將它們作為陣列返回。示例 1 輸入 2 輸出 0,1,1 示例 2 輸入 5 輸出 0,1,1,2,1,2 高階 思路 首先是乙個數減1,對應二進位制的變化就是最右的乙個1變為0,而這個1右邊的所...

Leetcode 338 位元位計數

給定乙個非負整數num。對於0 i num範圍中的每個數字i,計算其二進位制數中的 1 的數目並將它們作為陣列返回。示例 1 輸入 2輸出 0,1,1 示例 2 輸入 5輸出 0,1,1,2,1,2 高階 要求演算法的空間複雜度為o n 你能進一步完善解法嗎?要求在c 或任何其他語言中不使用任何內建...