劍指Offer 15 二進位制中1的個數

2021-09-07 03:45:51 字數 2364 閱讀 8120

面試題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

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中負數儲存比較不同。

>>

> bin(3)

'0b11'

>>

> bin(-3)

'-0b11'

同時python對數字沒有位數限制。因此就看個大概明白什麼意思就行了,想完全復現題目還得自己寫乙個補碼儲存的func。

給定乙個整數,編寫乙個函式來判斷它是否是 2 的冪次方。

示例 1:

輸入: 1

輸出: true

解釋: 20 = 1

示例 2:

輸入: 16

輸出: true

解釋: 24 = 16

示例 3:

輸入: 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

class

solution

(object):

defispoweroftwo

(self, n)

:"""

:type n: int

:rtype: bool

"""return n >

0and

not(n & n-

1)

位運算解法主要利用了一點,乙個數如果是2的冪,二進位制一定為100…000,1後面n個0。

在結合本題所說的 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...