2026-04-20:二进制反射排序。用go语言,把数组里每个数先转成二进制;对它的二进制表示做“二进制反射”(把二进制位从左到右反过来,前导零不计入);再把反射后的二进制串转回十进制,这个结果就是该
2026-04-20二进制反射排序。用go语言把数组里每个数先转成二进制对它的二进制表示做“二进制反射”把二进制位从左到右反过来前导零不计入再把反射后的二进制串转回十进制这个结果就是该元素的“反射值”。然后按所有元素的反射值从小到大排序若两个数的反射值相同则比较它们原始的数值大小原数更小的排在前面。最后返回排序后的数组。1 nums.length 100。1 nums[i] 1000000000。输入 nums [3,6,5,8]。输出 [8,3,6,5]。解释二进制反射值为3 - (二进制) 11 - (反转) 11 - 36 - (二进制) 110 - (反转) 011 - 35 - (二进制) 101 - (反转) 101 - 58 - (二进制) 1000 - (反转) 0001 - 1根据反射值排序为 [8, 3, 6, 5]。注意3 和 6 的反射值相同因此需要按原始值的升序排列。题目来自力扣3769。二进制反射排序完整过程详解第一步明确核心定义二进制转换把每个十进制数字转为无前导零的二进制字符串二进制反射将二进制字符串整体反转忽略反转后产生的前导零再转回十进制得到反射值排序规则优先按反射值从小到大排序反射值相同时按原始数值从小到大排序第二步逐个计算每个数字的反射值我们对数组[3, 6, 5, 8]中的每个元素依次计算反射值1. 数字 3十进制 → 二进制无前导零11二进制反射反转11反转后转回十进制3反射值 3原始值 32. 数字 6十进制 → 二进制无前导零110二进制反射反转011忽略前导零 →11反转后转回十进制3反射值 3原始值 63. 数字 5十进制 → 二进制无前导零101二进制反射反转101反转后转回十进制5反射值 5原始值 54. 数字 8十进制 → 二进制无前导零1000二进制反射反转0001忽略前导零 →1反转后转回十进制1反射值 1原始值 8第三步整理所有元素的「反射值原始值」整理后结果8反射值 1原始值 83反射值 3原始值 36反射值 3原始值 65反射值 5原始值 5第四步按照排序规则排序第一优先级反射值升序反射值大小1 3 5所以 81排第一55排最后3 和 6 反射值都是 3并列中间。第二优先级反射值相同时原始值升序3 和 6 反射值相同原始值3 6所以 3 排在 6 前面。第五步得到最终结果排序后数组[8, 3, 6, 5]时间复杂度 额外空间复杂度分析1. 时间复杂度核心操作是自定义排序Go 语言slices.SortFunc底层使用快速排序/优化排序时间复杂度为O(n log n)n 是数组长度。排序过程中每个元素会计算一次反射值计算反射值是固定位数的二进制操作常数时间 O(1)。总时间复杂度O(n log n)。2. 额外空间复杂度代码直接在原数组上进行排序没有创建新的数组存储数据。排序和计算反射值仅使用了常数个临时变量。总额外空间复杂度O(1)原地操作常数空间。总结完整执行流程计算每个数的二进制→二进制反转→计算反射值→按反射值排序→反射值相同按原数排序→输出结果时间复杂度O(n log n)额外空间复杂度O(1)原地排序无额外数组开销Go完整代码如下packagemainimport(cmpfmtmath/bitsslices)funcsortByReflection(nums[]int)[]int{slices.SortFunc(nums,func(a,bint)int{revA:int(bits.Reverse(uint(a))bits.LeadingZeros(uint(a)))revB:int(bits.Reverse(uint(b))bits.LeadingZeros(uint(b)))returncmp.Or(revA-revB,a-b)})returnnums}funcmain(){nums:[]int{3,6,5,8}result:sortByReflection(nums)fmt.Println(result)}Python完整代码如下# -*-coding:utf-8-*-defsort_by_reflection(nums):defreverse_bits(n):# 将整数转换为二进制字符串反转并去掉末尾的0ifn0:return0# 获取二进制表示去掉0b前缀binarybin(n)[2:]# 反转字符串reversed_binarybinary[::-1]# 转换为整数returnint(reversed_binary,2)defsort_key(num):revreverse_bits(num)# Python的排序是稳定的我们通过返回元组来实现多级排序return(rev,num)# 使用sort()方法进行原地排序nums.sort(keysort_key)returnnumsdefmain():nums[3,6,5,8]resultsort_by_reflection(nums)print(result)if__name____main__:main()C完整代码如下#includeiostream#includevector#includealgorithm#includebit#includecompareintreverseBits(intn){if(n0)return0;unsignedintustatic_castunsignedint(n);// C23 提供 std::bit_reverse// 如果编译器支持可以使用#if __cpp_lib_bit_reverse// 否则使用手动实现// 手动实现32位反转u((u0x55555555)1)|((u0xAAAAAAAA)1);u((u0x33333333)2)|((u0xCCCCCCCC)2);u((u0x0F0F0F0F)4)|((u0xF0F0F0F0)4);u((u0x00FF00FF)8)|((u0xFF00FF00)8);u(u16)|(u16);returnstatic_castint(u);}intleadingZeros(intn){if(n0)return32;returnstd::countl_zero(static_castunsignedint(n));}std::vectorintsortByReflection(std::vectorintnums){std::ranges::sort(nums,[](inta,intb){intrevAreverseBits(a)leadingZeros(a);intrevBreverseBits(b)leadingZeros(b);if(revA!revB){returnrevArevB;}returnab;});returnnums;}intmain(){std::vectorintnums{3,6,5,8};std::vectorintresultsortByReflection(nums);for(size_t i0;iresult.size();i){std::coutresult[i](iresult.size()-1?, :);}std::coutstd::endl;return0;}