给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。请你返回排序后的数组。
注意:arr中不含相同元素。
class Solution {
public int[] sortByBits(int[] arr) {
int n = arr.length;
int[] nums = new int[n];
HashMap<Integer, Integer> map = new HashMap<>();
for (int j : arr) {
map.put(j, By(j));
}
List<Map.Entry<Integer, Integer>> list = new LinkedList<>(map.entrySet());
list.sort(new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
int res = o1.getValue() - o2.getValue();
if (res == 0) {
res = o1.getKey() - o2.getKey();
}
return res;
}
});
int k = 0;
Map<Integer, Integer> result = new HashMap<>();
for (Map.Entry<Integer, Integer> entry : list) {
nums[k] = entry.getKey();
k++;
}
return nums;
}
public int By(int x) {
int count = 0;
String s = Integer.toBinaryString(x);
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '1') {
count++;
}
}
return count;
}
}