昨天的題不是不是很難,都會有自己的解法.
class solution(object):
def countbits0(self, num: int):
"""暴力統計"""
res =
for i in range(num + 1):
return res
def countbits1(self, num):
"""因為我發現當i是偶數時,和前乙個計算有關聯,那就是右移到當前數不是偶數時的次數就是上一次需要少掉的1的次數,同時加上這次的1
:type num: int
:rtype: list[int]
"""if not num:
return [0]
pre_list = [0 for _ in range(num + 1)]
pre_list[1] = 1
for i in range(2, num + 1):
count = 0
if not i & 1:
c = i
while not (c & 1):
# 統計需要減掉1的個數
count -= 1
# 右移
c >>= 1
# 更新i位置的值
pre_list[i] = pre_list[i-1] + count + 1
return pre_list
def countbits2(self, num: int):
def countones(x: int) -> int:
ones = 0
while x > 0:
# x &= (x - 1) 當x=0的時候,&的次數就是x中1的個數
x &= (x - 1)
ones += 1
return ones
bits = [countones(i) for i in range(num + 1)]
return bits
def countbits3(self, num: int):
"""dp過程,計算i中的1的個數,可以改為bits[i - highbit] + 1,其中highbit就是比i小的,
2的次數放也就是 2 ** x = highbit < i, 這個時候bits[i - highbit] + 1就是他的值
"""bits = [0]
highbit = 0
for i in range(1, num + 1):
# 判斷是否是偶數,其實可以用i & 1
if i & (i - 1) == 0:
highbit = i
return bits
def countbits4(self, num: int):
"""如果i為偶數的時候,統計1的個數,這個時候i的二進位制最後一位必定是0,這個時候和i>>1的1的個數是相等;
如果i是奇數的時候,統計1的個數,這個時候可以給i-1它就變成了偶數,這個時候(i-1) >> 1 + 1和i中1的個數相等,為什麼+1,減一之後的補償
"""bits = [0]
for i in range(1, num + 1):
return bits
def countbits(self, num: int):
"""這個很有意思,它的意思是找比i最小的偶數,然後再它的bits結果上+1
因為是二進位制,所以你將前16位二進位制表示寫出來之後,你會發現乙個偶數的二進位制,總比後面(也就是比他大的數)兩個數少乙個1
"""bits = [0]
for i in range(1, num + 1):
return bits
if __name__ == '__main__':
s = 10
s1 = solution()
root = s1.countbits(s)
print(root)
位元位計數
一 題目描述 二 題目分析 題解參考 自己分析沒分析出來,看完題解,忍不住妙出了聲。對於數字有兩類,偶數與奇數,從二進位制的角度看,奇數的二進位制標示肯定比前面乙個偶數多1,因為偶數的最低為0,而因為最低為為0,則讓乙個偶數的二進位制1的個數一定和自身除以2後的二進位制1的個數相等。通過上面這兩個特...
位元位計數
位元位計數 給定乙個非負整數 num。對於 0 i num 範圍中的每個數字 i 計算其二進位制數中的 1 的數目並將它們作為陣列返回。題解 這種題如果不加限制的話可以選擇移位 1的方式計算1的個數 但是要求是在o n 的時間複雜度下完成就需要腦筋急轉彎啦 0000 0 0001 1 0000 00...
位元位計數
給定乙個非負整數 num。對於 0 i num 範圍中的每個數字 i 計算其二進位制數中的 1 的數目並將它們作為陣列返回。示例 1 輸入 2 輸出 0,1,1 示例 2 輸入 5 輸出 0,1,1,2,1,2 1.暴力法 intisbinary int n return count int cou...