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+","); } } }