leetcode 2026-02-25 每日一练 - 根据数字二进制下 1 的数目排序

leetcode 2026-02-25 每日一练 - 根据数字二进制下 1 的数目排序
Austoin题目描述
LeetCode 1356. 根据数字二进制下 1 的数目排序
给你一个整数数组 arr。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。
请你返回排序后的数组。
解题思路
这道题的核心是自定义排序规则:
- 首先统计每个数字二进制表示中
1的个数 - 按照
1的个数升序排序(个数少的排前面) - 如果
1的个数相同,则按照数值大小升序排序
Go 语言提供了 bits.OnesCount() 函数来统计二进制中 1 的个数,非常方便。
代码实现
方法一:冒泡排序
1 | func sortByBits(arr []int) []int { |
方法二:标准库排序(推荐)
1 | func sortByBits(arr []int) []int { |
核心细节
- bits.OnesCount():Go 标准库函数,用于统计无符号整数二进制表示中
1的个数 - 排序条件:
cntA > cntB || (cntA == cntB && arr[j] > arr[j+1])- 如果
1的个数不同,个数多的排后面 - 如果
1的个数相同,数值大的排后面
- 如果
- cmp.Or():Go 1.21+ 新增函数,简化多条件比较逻辑
复杂度分析
方法一(冒泡排序)
- 时间复杂度:
O(n² × log(max(arr))),其中n是数组长度,log(max(arr))是统计1个数的时间 - 空间复杂度:
O(1),原地排序
方法二(标准库排序)
- 时间复杂度:
O(n log n × log(max(arr))),标准库使用快速排序或归并排序 - 空间复杂度:
O(log n),排序递归栈空间
总结
这道题考察自定义排序规则的实现:
- 方法一适合理解排序原理,但效率较低
- 方法二使用标准库,代码简洁且高效,推荐使用
cmp.Or()是处理多条件排序的优雅方式













