给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。
请你返回排序后的数组。
我的解法:重写Arrays.sort()的compare函数,使用Interger.bitCount()计算数组中元素的二进制下的1的数目,然后两两判断数组中元素的1的数目是否相同,若相同,则按照元素数值大小升序排序,若不同,则按照1的数目升序排序。
时间复杂度:O(n),空间复杂度:O(n)
class Solution {
public int[] sortByBits(int[] arr) {
/*将int[]转换为Integer[]*/
Integer[] tt = new Integer[arr.length];
for (int i = 0; i < arr.length; i++) {
tt[i] = arr[i];
}
/*排序Interger[]*/
// Arrays.sort(tt, new Comparator<Integer> () {
// @Override
// public int compare(Integer o1, Integer o2) {
// int bitCount1 = Integer.bitCount(o1);
// int bitCount2 = Integer.bitCount(o2);
// /*1的数目相同则按数值大小升序排列,不同则按1的数目升序排列*/
// return bitCount1 == bitCount2 ? o1 - o2 : bitCount1 - bitCount2;
// }
// });
Arrays.sort(tt, (o1, o2) -> {
int bitCount1 = Integer.bitCount(o1);
int bitCount2 = Integer.bitCount(o2);
return bitCount1 == bitCount2 ? o1 - o2 : bitCount1 - bitCount2;
});
/*将Interger[]转为int[]*/
for (int i = 0; i < arr.length; i++) {
arr[i] = tt[i];
}
return arr;
}
}