1.题目描述
给你一个整数数组 nums。
二进制反射 是对一个 正整数 的二进制表示按顺序反转(忽略前导零)后,将反转得到的二进制数转为十进制的结果。
请按每个元素的二进制反射值的 升序 对数组进行排序。如果两个不同的数字具有相同的二进制反射值,则 较小 的原始数字应排在前面。
返回排序后的数组。
示例 1:
输入: nums = [4,5,4]
输出: [4,4,5]
解释:
二进制反射值为:
- 4 -> (二进制)
100-> (反转)001-> 1 - 5 -> (二进制)
101-> (反转)101-> 5 - 4 -> (二进制)
100-> (反转)001-> 1
根据反射值排序为 [4, 4, 5]。
示例 2:
输入: nums = [3,6,5,8]
输出: [8,3,6,5]
解释:
二进制反射值为:
- 3 -> (二进制)
11-> (反转)11-> 3 - 6 -> (二进制)
110-> (反转)011-> 3 - 5 -> (二进制)
101-> (反转)101-> 5 - 8 -> (二进制)
1000-> (反转)0001-> 1
根据反射值排序为 [8, 3, 6, 5]。
注意,3 和 6 的反射值相同,因此需要按原始值的升序排列。
2.代码实现
class Solution {
public:
vector<int> sortByReflection(vector<int>& nums) {
sort(nums.begin(),nums.end(),[](const int a,const int b)
{
//rnum():求num的二进制反射结果
auto rnum=[](int num)
{
int ret=0;
while(num)
{
ret=ret*2+num%2;
num /= 2;
}
return ret;
};
int ra=rnum(a),rb=rnum(b);
if(ra!=rb) return ra<rb;
return a<b;
});
return nums;
}
};