题目
给定一个射击比赛成绩单,包含多个选手若干次射击的成绩分数,请对每个选手按其最高三个分数之和进行降序排名,输出降序排名后的选手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;
运行截图
PS:该代码未在华为机试平台运行,仅供参考!!!