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

一隻小危發表於2020-12-26

題目描述:

給你一個整數陣列 arr 。請你將陣列中的元素按照其二進位制表示中數字 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]
輸入:arr = [2,3,5,7,11,13,17,19]
輸出:[2,3,5,17,7,11,13,19]
提示:
1 <= arr.length <= 500
0 <= arr[i] <= 10^4




程式碼:

public class Day25 {
    // 只要呼叫系統自帶的排序函式
    public static int[] sortByBits(int[] arr) {
        int[] bit = new int[10001];   // 0 <= arr[i] <= 10^4
        List<Integer> list = new ArrayList<>();
        for(int x : arr){
            list.add(x);
            bit[x] = convert(x);  // 轉化為二進位制儲存,i是原陣列的值的大小,按原數值的大小進行排序
        }

        // 接下來排序二進位制的大小
        list.sort((x, y) -> {
            if (bit[x] != bit[y]) {
                return bit[x] - bit[y];
            } else {
                return x - y;
            }
        });

        for (int i = 0; i < arr.length; i++) {
            arr[i] = list.get(i);
        }
        return arr;
    }

    public static int convert(int x){
        int res = 0;
        while(x != 0){
            res += x % 2;
            x /= 2;
        }
        return res;
    }
    public static void main(String[] args) {
//        Day25 day = new Day25();
        int[] arr = {1024,512,256,128,64,32,16,8,4,2,1};
        int[] lastarr = sortByBits(arr);
        for (int i = 0; i < lastarr.length; i++) {
            System.out.println(lastarr[i]);
        }
    }
}
//時間複雜度:O(nlogn),其中 n 為整數陣列 arr 的長度。
//空間複雜度:O(n),其中 n 為整數陣列 arr 的長度。

相關文章