leetcode 1356. 根據數字二進位制下 1 的數目排序
阿新 • • 發佈:2021-01-25
技術標籤:C/C++程式設計序筆記leetcode
難度簡單98收藏分享切換為英文接收動態反饋
給你一個整數陣列arr
。請你將陣列中的元素按照其二進位制表示中數字1的數目升序排序。
如果存在多個數字二進位制中1的數目相同,則必須將它們按照數值大小升序排列。
請你返回排序後的陣列。
示例 1:
輸入:arr = [0,1,2,3,4,5,6,7,8] 輸出:[0,1,2,4,8,3,5,6,7] 解釋:[0] 是唯一一個有 0 個 1 的數。 [1,2,4,8] 都有 1 個 1 。 [3,5,6] 有 2 個 1 。 [7] 有 3 個 1 。 按照 1 的個數排序得到的結果陣列為 [0,1,2,4,8,3,5,6,7]
示例 2:
輸入:arr = [1024,512,256,128,64,32,16,8,4,2,1] 輸出:[1,2,4,8,16,32,64,128,256,512,1024] 解釋:陣列中所有整數二進位制下都只有 1 個 1 ,所以你需要按照數值大小將它們排序。
示例 3:
輸入:arr = [10000,10000] 輸出:[10000,10000]
示例 4:
輸入:arr = [2,3,5,7,11,13,17,19] 輸出:[2,3,5,17,7,11,13,19]
示例 5:
輸入:arr = [10,100,1000,10000] 輸出:[10,100,10000,1000]
提示:
1 <= arr.length <= 500
0 <= arr[i] <= 10^4
通過次數40,436提交次數55,014
題解:題目什麼要求,就按照要求來搞,沒有什麼奇技淫巧。時間複雜度O(nlogn)
class Solution { public: vector<int> sortByBits(vector<int>& arr) { vector<int> reti; vector<int> bits[15]; for(auto i:arr) { bitset<15> mybits(i); bits[mybits.count()].push_back(i); } for(int i=0;i<15;i++) { sort(bits[i].begin(),bits[i].end()); for(auto num:bits[i]) { reti.push_back(num); } } return reti; } };
執行結果:
通過
顯示詳情
執行用時:8 ms, 在所有C++提交中擊敗了99.80%的使用者
記憶體消耗:10.2 MB, 在所有C++提交中擊敗了70.83%的使用者