给N名员工的工资清单,按照工资分布的人数降序排序,如果有两个工资的人的数目一致(大概意思就是假设3000工资有3个人,5000也是三个人),就按照工资在给定清单的顺序里面排序。
解题思路:这道题的解题思路很简单,先统计每个工资有多少人,然后按照工资的人数降序打印出来。
代码:
import java.util.*; public class SaralySort { public static void main(String args[]){ Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int nums[]=new int[n]; for (int i=0;i<n;i++){ nums[i]=sc.nextInt(); } List<Integer>res=saraly(nums); for(int i=0;i<res.size();i++){ System.out.print(res.get(i)+" "); } } public static List<Integer> saraly( int nums[]){ if(nums==null||nums.length==0) return null; int length=nums.length; //新建一个计数数组,count[i][0]表示薪资,count[i][1]表示薪水出现次数。 int[][] counts=new int[length][2]; //用一个key来记录counts这个数组实际使用多少 int key=0; for(int i=0;i<length;i++){ //遍历,如果数组中已经存在,就把次数加一,否则的话就往数组后面加 for(int j=0;j<=key;j++){ if(nums[i]==counts[j][0]){ counts[j][1]++; break; } if(j==key){ counts[j][0]=nums[i]; counts[j][1]=1; key++; break; } } } Arrays.sort(counts, new Comparator<int[]>(){ @Override public int compare( int[] o1, int[] o2 ) { //因为相当于次数的降序,所以用的o2[1]-o1[1] return o2[1]-o1[1]; } }); List<Integer>list=new ArrayList<>(); for(int i=0;i<key;i++){ for(int j=0;j<counts[i][1];j++){ list.add(counts[i][0]); } } return list; } }