- 给定一个射击比赛成绩单
- 包含多个选手若干次射击的成绩分数
- 请对每个选手按其最高三个分数之和进行降序排名
- 输出降序排名后的选手id序列
- 条件如下
- 一个选手可以有多个射击成绩的分数,且次序不固定
- 如果选手的成绩之和相等,则相等的选手按照其id降序排列
- 如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名忽略该选手
//这里放回的集合存放的就是题目要求的选手成绩排序,根据题目要求遍历即可
public List<Integer> answer(int num, int[] id, int[] score){
//建立集合,存放运动员id, 射击次数, 成绩
Map<Integer, Integer[]> map = new HashMap<>(num);
//循环遍历,存放运动员的信息
for (int i = 0; i < id.length; i++) {
if (map.containsKey(id[i])){
map.put(id[i], new Integer[]{map.get(id[i])[0] + 1, map.get(id[i])[1] + score[i]});
}else {
map.put(id[i], new Integer[]{1, score[i]});
}
}
//用以排序
Map<Integer, List<Integer>> orderMap = new HashMap<>();
Set<Integer> integers = map.keySet();
//存放有效运动员的成绩和id
for (Integer ids : integers){
Integer[] data = map.get(ids);
if (data[0] >= 3){
if (orderMap.containsKey(data[1])){
orderMap.get(data[1]).add(ids);
}else {
List<Integer> list = new ArrayList<>();
list.add(ids);
orderMap.put(data[1], list);
}
}
}
Set<Integer> scoreSet = orderMap.keySet();
// Object[] scoreArr = scoreSet.toArray();
Integer[] arr = new Integer[scoreSet.size()];
scoreSet.toArray(arr);
Arrays.sort(arr, (o1, o2) -> o2 - o1);
System.out.println(Arrays.toString(arr));
List<Integer> idList = new ArrayList<>();
for (Integer o : arr) {
List<Integer> list = orderMap.get(o);
Integer[] tempArr = new Integer[list.size()];
list.toArray(tempArr);
if (list.size() > 1){
Arrays.sort(tempArr, (o1, o2) -> o2 - o1);
}
idList.addAll(Arrays.asList(tempArr));
System.out.println(Arrays.toString(tempArr));
}
return idList;
}