leetcode刷題系列

2021-09-23 08:13:12 字數 947 閱讀 1343

題目:

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

解題思路:

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

舉個例子:乙個二進位制數1111

1111

1111

,從右邊數起第一位是處於最右邊的乙個1

11。減去1

11後,二進位制數變為1110

1110

1110

,再和原數與操作 1111

&1110

1111\&1110

1111&1

110 ,得到結果1110

1110

1110

,這樣我們在原數的基礎上處理了乙個1

11,我們再進行一次這樣的操作,1110

1110

1110

減去乙個1

11,得到結果1101

1101

1101

,在和原數1110

1110

1110

與操作,得到結果1100

1100

1100

,因此我們發現減1

11的結果是把最右邊的乙個1開始的所有位都取反了。這個時候如果我們再把原來的整數和減去1之後的結果做與運算,從原來整數最右邊乙個1那一位開始所有位都會變成0。如1100&1011=1000.也就是說,把乙個整數減去1,再和原整數做與運算,會把該整數最右邊乙個1變成0.那麼乙個整數的二進位制有多少個1,就可以進行多少次這樣的操作。

**如下:

int count=

0,n;

class solution

return count;}}

;

LeetCode刷題系列1

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 ...

LeetCode刷題系列4

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...

LeetCode刷題系列10

給你乙個字串 s 和乙個字元規律 p,請你來實現乙個支援 和 的正規表示式匹配。匹配任意單個字元 匹配零個或多個前面的那乙個元素 所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 示例...