給定乙個非負整數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 或任何其他語言中不使用任何內建...