LeetCode1636-数组频率排序


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

这是个字节的算法面试题
import java.util.*;

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

    public static int[] frequencySort(int[] nums){
//        先用hashmap统计出一共每个数出现的频率
        HashMap<Integer,Integer> fre = new HashMap<>();
        for(Integer i:nums){
            fre.put(i,fre.getOrDefault(i,0)+1);
        }
        System.out.println(fre);
//        然后用list进行自定义排序,频率升序、数值降序
//        注意这里的新建怎么写的
        List<Map.Entry<Integer,Integer>> list = new ArrayList<>(fre.entrySet());
//        Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {
//            @Override
//            public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
////                这里是Integer 引用数据类型的比较用 equals比较好,==限制得太多了
//                if(o1.getValue().equals(o2.getValue())){
//                   return o2.getKey().compareTo(o1.getKey());
//                }else{
//                    return o1.getValue().compareTo(o2.getValue());
//                }
//            }
//        });
//        lambda 表达式
        Collections.sort(list,(Map.Entry<Integer,Integer> o1,Map.Entry<Integer,Integer> o2)->{
            if(o1.getValue().equals(o2.getValue())){
                   return o2.getKey().compareTo(o1.getKey());
                }else{
                    return o1.getValue().compareTo(o2.getValue());
                }
        });
        System.out.println(list);
//        然后把list,转化为数组输出

        int[] result = new int[nums.length];
        int m=0;
        for(int i=0;i<list.size();i++){
            for(int j=0;j<list.get(i).getValue();j++){
                result[m]=list.get(i).getKey();
                m++;
            }
        }
        return result;


    }

    public static void main(String[] args) {
        int[] a = {2,3,1,3,4,3,1,5};
        for(int num:a){
            System.out.print(num+",");
        }
        int[] b = frequencySort(a);
        for(int num:b){
            System.out.print(num+",");

        }

    }

}

 

posted on 2021-06-30 10:57  cStream  阅读(123)  评论(0)    收藏  举报