根据数字二进制下1的数目排序(简单)
2020年11月6日
题目来源:力扣
解题
- 暴力
通过重写Collections.sort方法进行条件排序,关键是进行1数目的计算,这里我使用了按位计算,效果差。
class Solution {
public int[] sortByBits(int[] arr) {
List<Integer> list=new ArrayList<>();
for(int i:arr)
list.add(i);
//定义每个数有多少位1
int[] bitNum=new int[10001];
for(int i=0;i<arr.length;i++)
bitNum[arr[i]]=getBit(arr[i]);
//自定义排序
Collections.sort(list,new Comparator<Integer>(){
public int compare(Integer x,Integer y){
if(bitNum[x]!=bitNum[y])
return bitNum[x]-bitNum[y];
else
return x-y;
}
});
for (int i = 0; i < arr.length; ++i) {
arr[i] = list.get(i);
}
return arr;
}
//使用二进制一位一位进行计算
public int getBit(int x){
int count=0;
while(x!=0){
if((x&1)==1) count++;
x=x>>1;
}
return count;
}
}
- 巧妙
这种解法直接用api计算1的个数,巧妙的是把1提到题目提供的最高位上,方便后面的排序和恢复
class Solution {
public int[] sortByBits(int[] arr) {
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.bitCount(arr[i]) * 10001 + arr[i];
}
Arrays.sort(arr);
for (int i = 0; i < arr.length; i++) {
arr[i] = arr[i] % 10001;
}
return arr;
}
}