题目
给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。
请你返回排序后的数组。
思路
本题首先要将数字转变为二进制,然后再统计二进制中的1的数量。
如果1的数量相同,则按数值的大小排列。
所以本题的关键在于compare的重写
代码
class Solution {
public int[] sortByBits(int[] arr) {
Integer[] newArr = Arrays.stream(arr).boxed().toArray(Integer[]::new);
Arrays.sort(newArr, new Comparator<Integer>(){
@Override
public int compare(Integer integer, Integer t1) {
String b1 = Integer.toBinaryString(integer);
String b2 = Integer.toBinaryString(t1);
int num1=0;
for (int i=0;i<b1.length();i++){
if (b1.charAt(i)=='1'){
num1+=1;
}
}
int num2=0;
for (int i=0;i<b2.length();i++){
if (b2.charAt(i)=='1'){
num2+=1;
}
}
int res = num1-num2;
if (res==0)
res = integer-t1;
return res;
}
});
int[] res = Arrays.stream(newArr).mapToInt(Integer::valueOf).toArray();
for (int i:res
) {
System.out.println(i);
}
return res;
}
}