36 Sort Integers by The Number of 1 Bits

題目

Given an integer array arr. You have to sort the integers in the array in ascending order by the number of 1’s in their binary representation and in case of two or more integers have the same number of 1’s you have to sort them in ascending order.

Return the sorted array.

Example 1:

Input: arr = [0,1,2,3,4,5,6,7,8]
Output: [0,1,2,4,8,3,5,6,7]
Explantion: [0] is the only integer with 0 bits.
[1,2,4,8] all have 1 bit.
[3,5,6] have 2 bits.
[7] has 3 bits.
The sorted array by bits is [0,1,2,4,8,3,5,6,7]

Example 2:

Input: arr = [1024,512,256,128,64,32,16,8,4,2,1]
Output: [1,2,4,8,16,32,64,128,256,512,1024]
Explantion: All integers have 1 bit in the binary representation, you should just sort them in ascending order.

Example 3:

Input: arr = [10000,10000]
Output: [10000,10000]

Example 4:

Input: arr = [2,3,5,7,11,13,17,19]
Output: [2,3,5,17,7,11,13,19]

Example 5:

Input: arr = [10,100,1000,10000]
Output: [10,100,10000,1000]

Constraints:

1 <= arr.length <= 500
0 <= arr[i] <= 10^4

分析

題意:給定整數數組,按二進制中1的個數進行升序表示。
如1,3,7 ,二進制爲1,11,111,所以排序結果爲1,3,7

問題在於,如何獲得1的個數。

根據異或運算
0^1=1
0^0=0

以及Integer.bitCount(i)可以求出異或之後1的個數。
因此,我們可以將當前值i,以及對應二進制異或後1的個數x,存在map中,然後對map按x排序,最後返回i序列。

解答

class Solution {
    public int[] sortByBits(int[] arr) {
        int n=arr.length;
        TreeMap map = new TreeMap();
        for (int value : arr) {
            map.put(value, Integer.bitCount(value ^ 0));
        }
        int[] res = new int[n];

        //這裏將map.entrySet()轉換成list
        List<Map.Entry<Integer,Integer>> list = new ArrayList<Map.Entry<Integer,Integer>>(map.entrySet());
        //然後通過比較器來實現排序
        //升序排序
        list.sort(Comparator.comparing(Map.Entry::getValue));

        int i=0;
        for(Map.Entry<Integer,Integer> mapping:list){
            res[i]=mapping.getKey();
            i++;
        }
        return res;
        
    }
}

在這裏插入圖片描述
然而,77個實例,只通過了54個。原因不知道。評論區的答案我也看不懂。
貼一下評論區的答案。

class Solution {
    public int[] sortByBits(int[] arr) {
        Integer[] a = new Integer[arr.length];
        for (int i = 0; i < a.length; ++i)
            a[i] = arr[i];
        Arrays.sort(a, Comparator.comparing(i -> Integer.bitCount(i) * 10000 + i));
        for (int i = 0; i < a.length; ++i)
            arr[i] = a[i];
        return arr;
        
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章