题目描述:
解题思路:
第一种方法:
统计数组中每一个元素中包含1的个数,存入新的数组,注意要先排序。这样再根据1的个数进行冒泡排序,将2个数组同步更新,就能实现按1的个数排序,而且如果1的个数相同时按照大小排序。
参考代码:
static char[] c;
static String s;
public static int[] sortByBits(int[] arr) {
int[] res=new int[arr.length];
Arrays.sort(arr);
for (int i = 0; i < arr.length; i++) {
s = Integer.toBinaryString(arr[i]);
res[i]=count(s);
}
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if(res[j]>res[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
int temp2=res[j];
res[j]=res[j+1];
res[j+1]=temp2;
}
}
}
return arr;
}
private static int count(String s) {
int ans=0;
c = s.toCharArray();
for (int i = 0; i < c.length; i++) {
if(c[i]=='1')
ans++;
}
return ans;
}
第二种方法:
参考了大佬的题解。知道了Integer.bitCount的API,就是计算int i 变成二进制后1的个数。题目中arr[i]的取值范围最大是10^4,所以可以将数组中含1的个数和大小一起存入一个数组,方法是让arr[i]中含1的个数*100000+arr[i],然后将新的数组排序后%100000,重新填入数组即可。tql,很秒的方法。
public int[] sortByBits(int[] arr) {
int[] a = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
a[i] = Integer.bitCount(arr[i]) * 100000 + arr[i];
}
Arrays.sort(a);
for (int i = 0; i < a.length; i++) {
a[i] = a[i] % 100000;
}
return a;
}