员工薪水排序问题(自己看错题系列)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Hollake/article/details/93867987

题目描述:

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

完整测试代码:中兴笔试员工薪水排序

猜你喜欢

转载自blog.csdn.net/Hollake/article/details/93867987