面試題15:二進位制中1的個數
題目:實現乙個函式,輸入乙個整數,輸出該數二級制表示中1的個數。
例:把9表示成二進位制是1001,有2位是1。因此如果輸入9,則該函式輸出2。
最直接的思路:從低位開始向高位逐一比較是否為1, 並計數。
時間複雜度:o(n),num的二進位制位數
空間複雜度:o(1)
利用二進位制數的乙個特點。a = /******…/ 1 /000000…/ 對於乙個二進位制數其最後乙個1的情況如左,對其 - 1 可得,a-1 = /******…/ 0 /111111…/ 。也就是說對乙個二進位制數-1的後果是,最低位的1變為0,在其之後的所有0變為1。此時為了完成該位 1 消去為 0 的操作,a & a-1, /******…/部分將保留不變,後面的部分將全為0。因此只要不停做如上操作,直到a=0,計數即可。
時間複雜度:o(k),k=1的個數
空間複雜度:o(1)
def
num_of_1_in_b
(num)
:"""
due to number in python3 has no bit limit
so flag << 1 will never equals 0
:param num:num
:return:num of 1 in bin(num)
"""flag =
1 count =
0for i in
range
(num.bit_length())
:if flag & num:
count +=
1 flag <<=1
return count
其實本題對於python來說有一點問題。def
num_of_1_in_b_2
(num)
: count =
0# will not work if num.bit_length() > 32
# if num < 0:
# num = num & 0xffffffff
while num:
num =
(num -1)
& num
count +=
1return count
書上特意提示了對於負數的處理。在python中負數儲存比較不同。
同時python對數字沒有位數限制。因此就看個大概明白什麼意思就行了,想完全復現題目還得自己寫乙個補碼儲存的func。>>
> bin(3)
'0b11'
>>
> bin(-3)
'-0b11'
給定乙個整數,編寫乙個函式來判斷它是否是 2 的冪次方。
示例 1:
輸入: 1示例 2:輸出: true
解釋: 20 = 1
輸入: 16示例 3:輸出: true
解釋: 24 = 16
輸入: 218輸出: false
class
solution
(object):
defispoweroftwo
(self, n)
:"""
:type n: int
:rtype: bool
"""if n ==0:
return
false
while
not(n %2)
: n = n//
2return
true
if n ==
1else
false
位運算解法主要利用了一點,乙個數如果是2的冪,二進位制一定為100…000,1後面n個0。class
solution
(object):
defispoweroftwo
(self, n)
:"""
:type n: int
:rtype: bool
"""return n >
0and
not(n & n-
1)
在結合本題所說的 a-1 & a可以消去最低位的1,那麼如果乙個數a是2的冪 必有 a-1 & a == 0。
劍指offer 15 二進位制中1的個數
位運算 左移運算子m 例如 00001010 2 00101000 10001010 3 01010000 右移運算子與左移類似,但右移時處理最左邊位時稍微複雜 1 如果數字是乙個無符號數值,則用0填補最左邊的n位 2 如果數字是乙個有符號數值,則用數字的符號填補最左邊的n位 00001010 2 ...
劍指offer 15 二進位制中1的個數
解題思路一 最佳方法 把乙個整數減去1,再和原整數做 與運算 會把該整數最右邊的1變成0。那麼乙個整數的二進位制中表示中有多少個1,就可以進行多少次這樣的操作。class solution def hammingweight self,n int int res 0 while n res 1 n ...
劍指 Offer 15 二進位制中1的個數
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。示例 1 輸入 00000000000000000000000000001011 輸出 3 解釋 輸入的二進位制串 0000000...