版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题目描述:
某公司中有N名员工。给定所有员工工资的清单,财务人员要按照特定的顺序排列员工的工资。他按照工资的频次降序排列,即给定清单中所有频次较高的工资将在频次较低的工资之前出现。如果相同数量的员工都有相同的工资,则将按照给定清单中该工资第一次出现的顺序排列。
输入:该函数/方法的输入包括两个参数num(一个整数,表示员工的人数)和salaries(一个正整数列表,表示N名员工的工资)。
输出:返回一个正整数列表,该列表按照员工工资的频次排序。
约束条件
1<=num<=10^5
1<=salaries[i]<=10^9
0=<i<num
用例:10,[20,40,26,25,40,20,40,20,40,25]
输出:40 40 40 40 20 20 20 25 25 26
自己把试题看错了,没有看到加粗的话,自己看用例理解成了先按频率排序,如果相同频率,那么就继续按照顺序???我是服了自己了。。。自己改题目系列,所以导致17个用例过了8个。还有我真想吐槽中兴的在线编程系统。
思路分析:
- 首先使用map统计频率,注意,要是用LinkedHashMap来统计,因为可以保证题意的有序。可以按照给定清单中该工资第一次出现的顺序排列。
- 接着创建两个辅助list,一个添加不重复的元素,一个添加元素所对应的频率,所在位置必须对应。
- 最后进行循环,将元素添加到list中。
代码:
public static List<Integer> reOrder(int num ,int[] salaries) {//这里数字长度用.length或者num都可以
List<Integer> list = new ArrayList<>();
Map<Integer, Integer> map = new LinkedHashMap<>();//保证在接下来取元素的时候的有序性
if (salaries == null || salaries.length == 0) return list;
// Arrays.sort(salaries);//自己手贱加了这句,导致出了错误,相同元素的按照大小顺序排序,例如测试用例加上这句就可以过,因为结果正好是我理解错的那种结果
for (int i = 0; i < salaries.length; i++) {
if (!map.containsKey(salaries[i])) {
map.put(salaries[i], 1);
}else{
map.put(salaries[i], map.get(salaries[i]) + 1);
}
}
List<Integer> help = new ArrayList<>();//不同元素的辅助list
List<Integer> count = new ArrayList<>();//不同元素所对应个数的list
for (Integer key : map.keySet()) {
help.add(key);//添加元素
count.add(map.get(key));//添加对应元素的频率
}
int len = count.size();
for (int i = 0; i < len; i++) {
int max = 0;//对应频率最大值
int index = 0;//频率最大值处所对应的下标
for (int j = 0; j < count.size(); j++) {
if (max < count.get(j)) {
max = count.get(j);//找到最大频率
index = j;//扎到最大频率所对应元素下标
}
}
for (int j = 0; j < max; j++) {
list.add(help.get(index));//添加max个index位置所对应的元素
}
// 添加后删除index位置所对应的元素和频率。
help.remove(index);
count.remove(index);
}
return list;
}
完整测试代码:中兴笔试员工薪水排序