「每日LeetCode」2020年11月6日
本文最后更新于:2023年3月19日 晚上
Lt1356. 根据数字二进制下 1 的数目排序
1356. 根据数字二进制下 1 的数目排序
给你一个整数数组 arr
。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。
请你返回排序后的数组。
示例 1:
1 |
|
示例 2:
1 |
|
排序。
示例 3:
1 |
|
示例 4:
1 |
|
示例 5:
1 |
|
提示:
1 <= arr.length <= 500
0 <= arr[i] <= 10^4
思路
转二进制字符串+暴力+哈希
建立一个哈希表,计算每个字符串二进制的 1 的数量加入对应哈希表的数组中。哈希表转数组:先按 1 的长度升序,再将数组内的数组排序,扁平化组成结果数组返回。
优化
一行实现,通过 sort,先比较 1 的数量,如果相同再比较数值大小
位运算计数方法优化
使用num &= (num-1)
代替 toString 转 2 进制再计数。过程如下例:
34520 ·1000011011011000
34519 1000011011010111
结果 1000011011010000
可以看到,每进行一次,结果都会少一个 1
解答
转二进制字符串+暴力+哈希
1 |
|
优化
1 |
|
位运算计数方法优化
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!