LeetCode-3769.[二进制反射排序]

0 阅读1分钟

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;
    }
};