題目描述:
某公司中有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;
}
完整測試代碼:中興筆試員工薪水排序