1. 程式人生 > 其它 >leetcode 1356. 根據數字二進位制下 1 的數目排序

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

技術標籤:C/C++程式設計序筆記leetcode

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

難度簡單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%的使用者