員工薪水排序問題(自己看錯題系列)

題目描述:

某公司中有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;
    }

完整測試代碼:中興筆試員工薪水排序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章