第一次的代码很有问题啊。
代码:
class Solution {
public int[] sortByBits(int[] arr) {
List<Integer> arrList = new ArrayList<>();
for (int value : arr) {
arrList.add(value);
}
arrList.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// getBits不能放在里面,太耗时
int val = getBits(o1) - getBits(o2);
return val == 0 ? o1 - o2 : val;
}
});
int[] sortByBits = new int[arr.length];
int index = 0;
for (Integer integer : arrList) {
sortByBits[index++] = integer;
}
return sortByBits;
}
private int getBits(int num) {
int cnt = 0;
while (num > 0) {
cnt += num & 1;// 加上num的最后一位
num >>= 1;
}
return cnt;
}
}
修改后:
class Solution {
public int[] sortByBits(int[] arr) {
List<Integer> arrList = new ArrayList<>();
// 0 <= arr[i] <= 10^4
int[] bits = new int[10010];// 标记相当于map
int index = 0;
for (int value : arr) {
arrList.add(value);
// 标记每个value中1的个数
bits[value] = getBits(value);
}
arrList.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
int val = bits[o1] - bits[o2];
return val == 0 ? o1 - o2 : val;
}
});
int[] sortByBits = new int[arr.length];
index = 0;
for (Integer integer : arrList) {
sortByBits[index++] = integer;
}
return sortByBits;
}
private int getBits(int num) {
int cnt = 0;
while (num > 0) {
cnt += num & 1;// 加上num的最后一位
num >>= 1;
}
return cnt;
}
}
另一种写法
class Solution {
public int[] sortByBits(int[] arr) {
int count, len = arr.length;
Node[] nodeArrays = new Node[len];
for (int i = 0; i < len; i++) {
count = 0;
int ar = arr[i];
while (ar > 0) {
count += ar % 2;
ar >>= 1;
}
nodeArrays[i] = new Node(arr[i], count);
}
Arrays.sort(nodeArrays, new Comparator<Node>() {
@Override
public int compare(Node o1, Node o2) {
if (o1.oneNumber == o2.oneNumber) {
return o1.value - o2.value;
}
return o1.oneNumber - o2.oneNumber;
}
});
int[] re = new int[len];
for (int i = 0; i < len; i++) {
re[i] = nodeArrays[i].value;
}
return re;
}
}
class Node {
int value;
int oneNumber;
Node(int value, int oneNumber) {
this.value = value;
this.oneNumber = oneNumber;
}
}