题目链接:3769. 二进制反射排序(简单)
算法原理:
解法:排序
击败40.79%
时间复杂度O(Nlogn)
①计算反射值:将数字转为二进制并反转,转回十进制(0 直接返回 0)
②绑定键值:构建二维数组,存储每个数字的(原数 - 反射值)配对
③自定义排序:按反射值升序排序,反射值相同则按原数升序
④提取结果:遍历配对数组,提取原数生成最终排序数组
Java代码:
java
class Solution {
public int[] sortByReflection(int[] nums) {
int n=nums.length;
int[][] pair=new int[n][2];
for(int i=0;i<n;i++){
pair[i][0]=nums[i];
pair[i][1]=conversion(nums[i]);
}
Arrays.sort(pair,(a,b)->{
if(a[1]!=b[1]) return a[1]-b[1];
return a[0]-b[0];
});
int[] ret=new int[n];
for(int i=0;i<n;i++) ret[i]=pair[i][0];
return ret;
}
public int conversion(int x){
if(x==0) return 0;
StringBuffer sb=new StringBuffer();
while(x!=0){
int tmp=x%2;
sb.append(tmp);
x/=2;
}
//2告诉程序前面的字符串是什么进制表示的数字,进而转换成十进制
return Integer.parseInt(sb.toString(),2);
}
}