編寫乙個函式,輸入是乙個無符號整數,返回其二進位制表示式中數字位數為 『1』 的個數(也被稱為漢明重量)。
例 1:
輸入:00000000000000000000000000001011方法一:能想到的最簡單的方法:將輸入的整數除以2,每次都統計其餘數為1的個數,直到該整數為0停止。輸出:3
解釋:輸入的二進位制串 00000000000000000000000000001011 中,共有三位為 『1』。
例 2:
輸入:00000000000000000000000010000000
輸出:1
解釋:輸入的二進位制串 00000000000000000000000010000000 中,共有一位為 『1』。
例 3:
輸入:11111111111111111111111111111101
輸出:31
解釋:輸入的二進位制串 11111111111111111111111111111101 中,共有 31 位為 『1』。
執行時為 o(logn).
class
solution
return res;}}
;
當然,這道題不會這麼無趣。
再進一步考慮,對於整數 n 和整數 n-1 來講,其二進位制下的最低位的個數肯定是不相同的。
例如 n = 10 = (1010), n - 1 = 9 = (1001), 二者的最低位不同。
因此,運算 n & ( n - 1) 的結果的二進位制表示下最低位肯定為 0.
迴圈進行 n & (n - 1) 操作,本質上就是將 n 的二進位制下第乙個為 1 的位改變為 0, 統計該運算的次數即可。
class
solution
return sum;}}
;
當然,還能進一步優化。
位運算是乙個很有意思的操作。
對於乙個整數 n, 如何統計其二進位制為 1 的位數?
我們可以用自身統計:先分組,將對應位置上的二進位制位更改為每組中 1 個數,合併即可。
如何合併?例如,在上圖中, 10 和 01 需要相加,最終成為 0011.
LeetCode 每日 1 題 打卡刷題計畫
活動頁面 佇列 隊首出,隊尾進 先進先出 queue 的基本操作有 q.push x 隊尾 d.push back x 隊尾 d.push front x 隊首 q.pop d.pop back d.pop front struct listnode vector操作push back 在陣列的最後...
每日刷題 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 例 1 輸入...
每日刷題總結
public class parent voidm2 protected voidm3 public static voidm4 a.子類中一定能夠繼承和覆蓋parent類的m1方法 b.子類中一定能夠繼承和覆蓋parent類的m2方法 c.子類中一定能夠繼承和覆蓋parent類的m3方法 d.子類...