Easy
题目描述
给你一个整数数组 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 具有相同的反射值,所以我们按原数值的升序排列它们。
提示:
1 <= nums.length <= 1001 <= nums[i] <= 10^9
解题思路
这道题需要我们根据数字的二进制反射值进行排序。解题思路如下:
步骤分析:
- 计算二进制反射值:对于每个数字,先将其转换为二进制字符串,然后反转这个字符串,最后转换回十进制数
- 自定义排序:使用自定义比较函数,首先按二进制反射值排序,如果反射值相同,则按原数值排序
- 处理细节:注意反转二进制字符串时要去除前导零
算法实现:
- 创建辅助函数计算二进制反射值
- 使用稳定排序算法,确保相同反射值的元素按原值排序
- 时间复杂度主要取决于排序操作
优化考虑: 由于数据规模较小(最多100个元素),可以直接使用内置排序函数配合自定义比较器。对于二进制反射值的计算,可以通过位操作优化,但在此题规模下字符串操作已足够高效。
代码实现
class Solution {
public:
int getBinaryReflection(int num) {
string binary = "";
while (num > 0) {
binary += (num % 2) ? '1' : '0';
num /= 2;
}
// binary is already reversed since we built it from right to left
int reflection = 0;
for (char c : binary) {
reflection = reflection * 2 + (c - '0');
}
return reflection;
}
vector<int> sortByReflection(vector<int>& nums) {
sort(nums.begin(), nums.end(), [this](int a, int b) {
int reflectionA = getBinaryReflection(a);
int reflectionB = getBinaryReflection(b);
if (reflectionA == reflectionB) {
return a < b;
}
return reflectionA < reflectionB;
});
return nums;
}
};
class Solution:
def sortByReflection(self, nums: List[int]) -> List[int]:
def getBinaryReflection(num):
binary_str = bin(num)[2:] # Remove '0b' prefix
reversed_binary = binary_str[::-1]
return int(reversed_binary, 2)
return sorted(nums, key=lambda x: (getBinaryReflection(x), x))
public class Solution {
public int[] SortByReflection(int[] nums) {
int GetBinaryReflection(int num) {
string binary = Convert.ToString(num, 2);
char[] binaryArray = binary.ToCharArray();
Array.Reverse(binaryArray);
string reversedBinary = new string(binaryArray);
return Convert.ToInt32(reversedBinary, 2);
}
Array.Sort(nums, (a, b) => {
int reflectionA = GetBinaryReflection(a);
int reflectionB = GetBinaryReflection(b);
if (reflectionA == reflectionB) {
return a.CompareTo(b);
}
return reflectionA.CompareTo(reflectionB);
});
return nums;
}
}
var sortByReflection = function(nums) {
function getBinaryReflection(num) {
return parseInt(num.toString(2).split('').reverse().join(''), 2);
}
return nums.sort((a, b) => {
const reflectionA = getBinaryReflection(a);
const reflectionB = getBinaryReflection(b);
if (reflectionA === reflectionB) {
return a - b;
}
return reflectionA - reflectionB;
});
};
复杂度分析
| 复杂度类型 | 分析 |
|---|---|
| 时间复杂度 | O(n log n × k),其中 n 是数组长度,k 是数字的平均二进制位数。排序需要 O(n log n),每次比较需要计算二进制反射值 O(k) |
| 空间复杂度 | O(k),用于存储二进制字符串和递归调用栈 |