标题描绘:
某公司中有N名职工。给定一切职工薪酬的清单,财务人员要依照特定的次序摆放职工的薪酬。他依照薪酬的频次降序摆放,即给定清单中一切频次较高的薪酬将在频次较低的薪酬之前呈现。假如相同数量的职工都有相同的薪酬,则将依照给定清单中该薪酬第一次呈现的次序摆放。A8站源码交易平台
输入:该函数/办法的输入包含两个参数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个。还有我真想吐槽中兴的在线编程体系。A8站源码交易平台
思路剖析:
首要运用map计算频率,留意,要是用LinkedHashMap来计算,由于能够确保题意的有序。能够依照给定清单中该薪酬第一次呈现的次序摆放。
接着创立两个辅佐list,一个增加不重复的元素,一个增加元素所对应的频率,所在方位有必要对应。
最终进行循环,将元素增加到list中。A8站源码交易平台
代码:
public static ListreOrder(int num ,int[] salaries) {//这儿数字长度用.length或许num都能够
Listlist = new ArrayList<>();
Map
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);
}
}
Listhelp = new ArrayList<>();//不同元素的辅佐list
Listcount = 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;
}