力扣1356 根據數字二進位制下 1 的數目排序

2021-10-10 07:44:21 字數 663 閱讀 2573

給你乙個整數陣列 arr 。請你將陣列中的元素按照其二進位制表示中數字 1 的數目公升序排序。

如果存在多個數字二進位制中 1 的數目相同,則必須將它們按照數值大小公升序排列。

請你返回排序後的陣列。

解答:統計二進位制1的個數可以分別獲取每個二進位制位數,然後再統計其1的個數,此方法效率比較低。這裡介紹另外一種高效的方法,同樣以 34520 為例,我們計算其 a &= (a-1)的結果:

第一次:計算前:1000 0110 1101 1000 計算後:1000 0110 1101 0000 第二次:計算前:1000 0110 1101 0000 計算後:1000 0110 1100 0000 第二次:計算前:1000 0110 1100 0000 計算後:1000 0110 1000 0000 我們發現,沒計算一次二進位制中就少了乙個 1 因此可以用此方法求1的個數,即下面的count_one函式。

int count_one(int a)

bool cmp(int a, int b)

};

放在類外就不用關鍵字static的事,放裡面如下

class solution 

return cnt;

}static bool cmp(int a,int b)

};

力扣1356 根據數字二進位制下 1 的數目排序

知識點 class solution while x cp 0 vector反轉的方式 方式1 reverse res.begin res.end 方式2 return static int countones const vector b return cnt static bool mycmp ...

1356 根據數字二進位制下 1 的數目排序

hello aohy 今天呢做了個決定好好學演算法,嗯,力扣每日打卡,希望你能堅持下去。這是鏈結 看到題目首先想到的就是暴力排序了,但是注意到 大小是有兩個規則 所以簡單點的想法就是計算每個數二進位制表示中1的個數,統計比較輸出就行。然後我去看題解了。然後我知道了sort的重寫規則樣式 這樣的cla...

1356 根據數字二進位制下 1 的數目排序

給你乙個整數陣列 arr 請你將陣列中的元素按照其二進位制表示中數字 1 的數目公升序排序。如果存在多個數字二進位制中 1 的數目相同,則必須將它們按照數值大小公升序排列。請你返回排序後的陣列。示例 1 輸入 arr 0,1,2,3,4,5,6,7,8 輸出 0,1,2,4,8,3,5,6,7 解釋...