题目描述
给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。
请你返回排序后的数组。
关键是重写排序方法,看下面程序即可,此排序算法需要转换为List进行排序。
方法一:暴力
对每个十进制的数转二进制的时候统计一下 1 的个数即可。
class Solution {
public int[] sortByBits(int[] arr) {
int[] bit = new int[10001];
List<Integer> list = new ArrayList<Integer>();
for (int x : arr) {
list.add(x);
bit[x] = get(x);
}
//重写排序方法
Collections.sort(list, new Comparator<Integer>() {
public int compare(Integer x, Integer y) {
if (bit[x] != bit[y]) {
return bit[x] - bit[y];
} else {
return x - y;
}
}
});
for (int i = 0; i < arr.length; ++i) {
arr[i] = list.get(i);
}
return arr;
}
public int get(int x) {
int res = 0;
while (x != 0) {
res += x % 2;
x /= 2;
}
return res;
}
}
方法二:递推预处理
动态规划预处理
bit[i]=bit[i>>1]+(i&1)
class Solution {
public int[] sortByBits(int[] arr) {
List<Integer> list = new ArrayList<Integer>();
for (int x : arr) {
list.add(x);
}
int[] bit = new int[10001];
for (int i = 1; i <= 10000; ++i) {
bit[i] = bit[i >> 1] + (i & 1);
}
Collections.sort(list, new Comparator<Integer>() {
public int compare(Integer x, Integer y) {
if (bit[x] != bit[y]) {
return bit[x] - bit[y];
} else {
return x - y;
}
}
});
for (int i = 0; i < arr.length; ++i) {
arr[i] = list.get(i);
}
return arr;
}
}
方法三、很巧妙的一个方法
class Solution {
public int[] sortByBits(int[] arr) {
int[] map = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
map[i] = Integer.bitCount(arr[i]) * 10000000 + arr[i];
}
Arrays.sort(map);
for (int i = 0; i < map.length; i++) {
map[i] = map[i] % 10000000;
}
return map;
}
}