给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。
请你返回排序后的数组。
输入:arr = [0,1,2,3,4,5,6,7,8]
输出:[0,1,2,4,8,3,5,6,7]
解释:[0] 是唯一一个有 0 个 1 的数。
[1,2,4,8] 都有 1 个 1 。
[3,5,6] 有 2 个 1 。
[7] 有 3 个 1 。
按照 1 的个数排序得到的结果数组为 [0,1,2,4,8,3,5,6,7]
思路:首先统计1的个数;然后通过自定义比较器;先按照1的个数进行排序,然后按照数值大小排序;统计1的个数;这里利用n&(n-1)可以消掉1个1特性;这里主要比较器定义;
public class Main1 {
public static int get1(int n) {
int count = 0;
while (n != 0) {
n &= (n - 1);
count++;
}
return count;
}
public static void main(String[] args) {
Integer tmp[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
Arrays.sort(tmp, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
int diff = get1((Integer) o1) - get1((Integer) o2);
if (diff == 0) return (Integer) o1 - (Integer) o2;
return diff;
}
});
}
}
计算一个数字的二进制1的个数
思路:1&1=1;1&0=0;
num 右移操作;从而判别二进制个数:
fn(int a){
int count=0;
while(a>0){
if(num&1)==1){
count++;
}
num=(num>>1);
}}