1. 程式人生 > 其它 >#力扣 LeetCode1356. 根據數字二進位制下 1 的數目排序 @FDDLC

#力扣 LeetCode1356. 根據數字二進位制下 1 的數目排序 @FDDLC

技術標籤:演算法&資料結構

題目描述:

https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits/

Java程式碼:

class Solution {
    public int[] sortByBits(int[] a) {
        int min=a[0],max=a[0];
        for(int i=1;i<a.length;i++){
            if(max<a[i])max=a[i];
            else if(min>a[i])min=a[i];
        }
        int[] count=new int[max-min+1],bv=new int[max+1],countb=new int[Integer.toBinaryString(max).length()+1],ans=new int[a.length];
        for(int e:a){
            count[e-min]++;
            if(bv[e-min]==0)bv[e-min]=Integer.bitCount(e);
            countb[bv[e-min]]++;
        }
        for(int i=0,v=min,ai=0;i<count.length;i++,v++){
            for(int j=0;j<count[i];j++)a[ai++]=v;
        }
        for(int i=1;i<countb.length;i++)countb[i]+=countb[i-1];
        for(int i=a.length-1;i>=0;i--){
            ans[--countb[bv[a[i]-min]]]=a[i];
        }
        return ans;
    }
}

Java程式碼二:

class Solution { //乘以比10000大但又不會使結果溢位的數即可
    public int[] sortByBits(int[] a) { //0 <= arr[i] <= 10^4
        for(int i=0;i<a.length;i++)a[i]+=Integer.bitCount(a[i])*10001; //乘以其他更大的數亦可,但結果不能溢位
        Arrays.sort(a);
        for(int i=0;i<a.length;i++)a[i]%=10001; //上面為10001,此處保持一致
        return a;
    }
}