2022年9月19日 每日一题 1636 简单题

58 阅读1分钟

给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。  请你返回排序后的数组。

主要考察的是哈希映射的自定义排序,关于对多个数组的排序可以参考下面这篇文章

Java 通过Index(索引)数组同时对多个数组进行排序-CJavaPy

直接附上一位大佬的题解

class Solution {
    public int[] frequencySort(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int num: nums) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        return Arrays.stream(nums).boxed().sorted((a, b) -> {
            if (map.get(a) != map.get(b)) {
                return map.get(a) - map.get(b);
            }
            return b - a;
        }).mapToInt(Integer::valueOf).toArray();
    }
}
作者:himymBen
        链接:https://leetcode.cn/problems/sort-array-by-increasing-frequency/solution/p-by-himymben-r24t/
        来源:力扣(LeetCode)
        著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
public class test {
    public static void main(String[] args) {
        int nums[]={1,1,2,2,2,3};
        int n=nums.length;

        Map<Integer, Integer> map = new HashMap<Integer, Integer>();

        for(int i=0;i<n;i++){
            map.put(nums[i],map.getOrDefault(nums[i],0)+1);//getOrDefault是获取指定的key值对应的value,如果不存在该key,返回默认值
        }

        List<int []> l1 = new ArrayList<>();

        for(int key:map.keySet()){
            // l1.add(new int[]{key,map.get(key)});
            // 未优化时是
            int cc[]={key,map.get(key)};
            l1.add(cc);
        }
//        未排序前
        for (int[] a :
                l1) {
            for (int i :
                    a) {
                System.out.print(i+" ");
            }
            System.out.println();
        }

//        关键在于此:
        l1.sort((a, b) -> a[1] != b[1] ? a[1] - b[1] : b[0] - a[0]);
        System.out.println("=================================");

//        排序后
        for (int[] a :
                l1) {
            for (int i :
                    a) {
                System.out.print(i+" ");
            }
            System.out.println();
        }
    }
}