力扣题目链接
题目描述:
给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。
请你返回排序后的数组。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sort-integers-by-the-number-of-1-bits
示例 1:
输入:arr = [0,1,2,3,4,5,6,7,8]
输出:[0,1,2,4,8,3,5,6,7]
解释:[0] 是唯一一个有 0 个 1 的数。
[1,2,4,8] 都有 1 个 1 。
[3,5,6] 有 2 个 1 。
[7] 有 3 个 1 。
按照 1 的个数排序得到的结果数组为 [0,1,2,4,8,3,5,6,7]
解题思路:
采用高位存储bit位数,低位存储原始值。
由于原始值最大为10^4,即10000,5个长度,所以扩充系数取5+1 个长度,即100000,其中+1是为了存储位权。
1. 遍历,乘以100000,算法设计十进制的高位存储bit为1的数量,十进制的高位存bit位数;
2.加上原始值,十进制的低位存原始值,低位的5个0是存原始值所需最大长度;
3.数组排序
4.遍历,取余,获取排序好的原始值
5.直接返回结果、
完整代码如下:
public int[] sortByBits(int[] arrs) {
for (int i = 0; i < arrs.length; i++) {
arrs[i] += Integer.bitCount(arrs[i]) * 100000;
}
Arrays.sort(arrs);
for (int i = 0; i < arrs.length; i++) {
arrs[i] %= 100000;
}
return arrs;
}
参考代码联想录,刷题主要跟着大佬在刷,一个小目标 先刷个100题。