题目链接
解题思路
-
频次高位,原值取反(降序),拼接正数,排序后还原原值。
-
首先注意到
1 <= nums.length <= 100
,-100 <= nums[i] <= 100
-
所以设置一个
tmp[201]
用来记录nums
中数的频率 -
原值取反,拼接正数:然后对每个数,令其为
频率 * 1000 - nums[i] + 100
-
之后进行排序,这样子就即按频率升序,又按照各自数值降序
-
最后返回
100 - nums[i] % 1000
AC代码
class Solution {
public int[] frequencySort(int[] nums) {
int[] tmp = new int[201];
for (int n : nums)
tmp[n + 100]++;
for (int i = 0; i < nums.length; i++)
nums[i] = tmp[nums[i] + 100] * 1000 - nums[i] + 100;
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++)
nums[i] = 100 - nums[i] % 1000;
return nums;
}
}
本地测试代码
package com.company;
import java.util.Arrays;
public class Solution_1636 {
public static int[] frequencySort(int[] nums) {
int[] tmp = new int[201];
for (int n : nums)
tmp[n + 100]++;
for (int i = 0; i < nums.length; i++)
nums[i] = tmp[nums[i] + 100] * 10000 - nums[i] + 100;
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++)
nums[i] = 100 - nums[i] % 10000;
return nums;
}
public static void main(String[] args) {
System.out.println(Arrays.toString(frequencySort(new int[]{1, 1, 2, 2, 2, 3})));
System.out.println(Arrays.toString(frequencySort(new int[]{2, 3, 1, 3, 2})));
System.out.println(Arrays.toString(frequencySort(new int[]{-1, 1, -6, 4, 5, -6, 1, 4, 1})));
}
}