劍指offer 第15 16題

2021-08-20 22:05:33 字數 2000 閱讀 1181

輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。

# -*- coding:utf-8 -*-

classsolution:

defnumberof1(self, n):

# write code here

count = 0

ifn < 0:

n = n & 0xffffffff

whilen:

count += 1

n = (n - 1) & n

returncount

如果乙個整數不為0,那麼這個整數至少有一位是1。如果我們把這個整數減1,那麼原來處在整數最右邊的1就會變為0,原來在1後面的所有的0都會變成1(如果最右邊的1後面還有0的話)。其餘所有位將不會受到影響。

舉個例子:乙個二進位制數1100,從右邊數起第三位是處於最右邊的乙個1。減去1後,第三位變成0,它後面的兩位0變成了1,而前面的1保持不變,因此得到的結果是1011.我們發現減1的結果是把最右邊的乙個1開始的所有位都取反了。這個時候如果我們再把原來的整數和減去1之後的結果做與運算,從原來整數最右邊乙個1那一位開始所有位都會變成0。如1100&1011=1000.也就是說,把乙個整數減去1,再和原整數做與運算,會把該整數最右邊乙個1變成0.那麼乙個整數的二進位制有多少個1,就可以進行多少次這樣的操作。

其中,if是由於,對於負數,最高位為1,而負數在計算機是以補碼存在的,往右移,符號位不變,符號位1往右移,最終可能會出現全1的情況,導致死迴圈。與0xffffffff相與,就可以消除負數的影響

數值的整數次方

給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。

# -*- coding:utf-8 -*-

classsolution:

defpower(self, base, exponent):

# write code here

result=1

ifbase==0:

return0

ifexponent==0:

return1

ifexponent<0:

whileexponent:

exponent+=1

result=result*base

return1/result

ifexponent>0:

whileexponent:

exponent-=1

result=result*base

returnresult

沒什麼好說的,就是考慮指數為0、負,底數為0等情況。

還有python短的寫法:

# -*- coding:utf-8-*-

classsolution:

def power(self, base, exponent):

# write code here

returnbase**exponent

劍指Offer 第1題

問題 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。暴力法 分析 直接遍歷一遍陣列,即可判斷目標target是否存在。複雜度分析 時間複雜度 o n 2 因...

劍指offer第6題

目標 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。思路 當遇到第乙個小於前面的數時,即可能為最小值,把此值跟第乙個值...

劍指offer第28題擴充套件題

輸入乙個字串,輸出該字串中字元的所有組合。舉個例子,如果輸入abc,它的組合有a b c ab ac bc abc。總的思路類似前面幾篇部落格裡寫的,不過前面的部落格裡面ab,ba算不一樣的,這裡其實就是3選1,3選2,3選3,那現在就考慮n選m怎麼取。假設有n個元素,要選m個,總共的排列數為f n...