华为机试练习———射击比赛

256 阅读1分钟

题目

给定一个射击比赛成绩单,包含多个选手若干次射击的成绩分数,请对每个选手按其最高三个分数之和进行降序排名,输出降序排名后的选手id序列,条件如下

1.一个选手可以有多个射击成绩的分数,且次序不固定

2.如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名忽略该选手

3.如果选手的成绩之和相等,则相等的选手按照其id降序排列

代码

public List<Integer> solution(int count, int[] personIDs , int[] grades){
    //拿到每个人的比赛成绩
    Map<Integer,List<Integer>> map = new HashMap<>();
    for (int i = 0,j = 0 ; i < count; i++ ,j++) {
        if (map.containsKey(personIDs[i])){
            List<Integer> strings = map.get(personIDs[i]);
            strings.add(grades[j]);
            map.put(personIDs[i],strings);
        }else {
            List<Integer> list = new ArrayList<>();
            list.add(grades[j]);
            map.put(personIDs[i],list);
        }
    }
    //过滤比赛成绩小于三个的人
    List<Map.Entry<Integer, List<Integer>>> list = map.entrySet().stream().filter(value -> value.getValue().size() >= 3).collect(Collectors.toList());
    
    //对结果进行排序
    Collections.sort(list, new Comparator<Map.Entry<Integer, List<Integer>>>() {
        @Override
        public int compare(Map.Entry<Integer, List<Integer>> map1, Map.Entry<Integer, List<Integer>> map2) {
            List<Integer> value2 = map2.getValue();
            List<Integer> value1 = map1.getValue();
            Collections.sort(value1);
            int sum1 = value1.get(value1.size()-1) + value1.get(value1.size()-2) + value1.get(value1.size()-3);
            int sum2 = value2.get(value2.size()-1) + value2.get(value2.size()-2) + value2.get(value2.size()-3);
            int result = sum2 - sum1;
            if (result==0){
                result = map2.getKey() - map1.getKey();
            }
            return result;
        }
    });
    List result = new ArrayList();
    for (Map.Entry<Integer, List<Integer>> listEntry : list) {
        result.add(listEntry.getKey());
    }
    return result;

运行截图

image.png

PS:该代码未在华为机试平台运行,仅供参考!!!