
2026-04-20:二进制反射排序。用go语言,把数组里每个数先转成二进制;对它的二进制表示做“二进制反射”(把二进制位从左到右反过来,前导零不计入);再把反射后的二进制串转回十进制,这个结果就是该元素的“反射值”。
然后按所有元素的反射值从小到大排序;若两个数的反射值相同,则比较它们原始的数值大小,原数更小的排在前面。
最后返回排序后的数组。
1 <= nums.length <= 100。
1 <= nums[i] <= 1000000000。
输入: 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 的反射值相同,因此需要按原始值的升序排列。
题目来自力扣3769。
我们对数组 [3, 6, 5, 8] 中的每个元素,依次计算反射值:
11113110011(忽略前导零 → 11)3101101510000001(忽略前导零 → 1)1整理后结果:
1 < 3 < 5
所以 8(1)排第一,5(5)排最后;3 和 6 反射值都是 3,并列中间。3 < 6,所以 3 排在 6 前面。排序后数组:[8, 3, 6, 5]
slices.SortFunc 底层使用快速排序/优化排序,时间复杂度为 O(n log n)(n 是数组长度)。.
package main
import (
"cmp"
"fmt"
"math/bits"
"slices"
)
func sortByReflection(nums []int) []int {
slices.SortFunc(nums, func(a, b int)int {
revA := int(bits.Reverse(uint(a)) >> bits.LeadingZeros(uint(a)))
revB := int(bits.Reverse(uint(b)) >> bits.LeadingZeros(uint(b)))
return cmp.Or(revA-revB, a-b)
})
return nums
}
func main() {
nums := []int{3, 6, 5, 8}
result := sortByReflection(nums)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def sort_by_reflection(nums):
def reverse_bits(n):
# 将整数转换为二进制字符串,反转并去掉末尾的0
if n == 0:
return0
# 获取二进制表示(去掉'0b'前缀)
binary = bin(n)[2:]
# 反转字符串
reversed_binary = binary[::-1]
# 转换为整数
returnint(reversed_binary, 2)
def sort_key(num):
rev = reverse_bits(num)
# Python的排序是稳定的,我们通过返回元组来实现多级排序
return (rev, num)
# 使用sort()方法进行原地排序
nums.sort(key=sort_key)
return nums
def main():
nums = [3, 6, 5, 8]
result = sort_by_reflection(nums)
print(result)
if __name__ == "__main__":
main()
.
#include <iostream>
#include <vector>
#include <algorithm>
#include <bit>
#include <compare>
int reverseBits(int n) {
if (n == 0) return0;
unsigned int u = static_cast<unsigned int>(n);
// C++23 提供 std::bit_reverse
// 如果编译器支持,可以使用:#if __cpp_lib_bit_reverse
// 否则使用手动实现
// 手动实现32位反转
u = ((u & 0x55555555) << 1) | ((u & 0xAAAAAAAA) >> 1);
u = ((u & 0x33333333) << 2) | ((u & 0xCCCCCCCC) >> 2);
u = ((u & 0x0F0F0F0F) << 4) | ((u & 0xF0F0F0F0) >> 4);
u = ((u & 0x00FF00FF) << 8) | ((u & 0xFF00FF00) >> 8);
u = (u << 16) | (u >> 16);
return static_cast<int>(u);
}
int leadingZeros(int n) {
if (n == 0) return32;
return std::countl_zero(static_cast<unsigned int>(n));
}
std::vector<int> sortByReflection(std::vector<int>& nums) {
std::ranges::sort(nums, [](int a, int b) {
int revA = reverseBits(a) >> leadingZeros(a);
int revB = reverseBits(b) >> leadingZeros(b);
if (revA != revB) {
return revA < revB;
}
return a < b;
});
return nums;
}
int main() {
std::vector<int> nums = {3, 6, 5, 8};
std::vector<int> result = sortByReflection(nums);
for (size_t i = 0; i < result.size(); ++i) {
std::cout << result[i] << (i < result.size() - 1 ? ", " : "");
}
std::cout << std::endl;
return0;
}

·
我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。
·