目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
给定一个射击比赛成绩单,包含多个选手若干次射击的成绩分数,请对每个选手按其最高3个分数之和进行降序排名,输出降序排名后的选手ID序列。
条件如下:
- 一个选手可以有多个射击成绩的分数,且次序不固定
- 如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名忽略该选手
- 如果选手的成绩之和相等,则成绩之和相等的选手按照其ID降序排列。
二、输入描述
输入第一行,一个整数N,表示该场比赛总共进行了N次射击,产生N个成绩分数(2<=N<=100);
输入第二行,一个长度为N整数序列,表示参与每次射击的选手ID(0<=ID<=99);
输入第三行,一个长度为N整数序列,表示参与每次射击的选手对应的成绩(0<=成绩<=100)。
三、输出描述
符合题设条件的降序排名后的选手ID序列。
四、解题思路
- 第一行输入选手人数;
- 第二行输入选手ID;
- 第三行输入选手所得分数;
- 定义listMap,key:选手ID,value:每个选手的分数列表;
- 定义map,key:选手ID,value:每个选手最高的3个分数之和;
- 如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名忽略该选手;
- 对每个选手的分数进行降序排序;
- 计算每个选手最高的3个分数之和;
- 按照每个选手最高的3个分数之和降序排序,如果分数相等,按选手ID序列降序排序,否则先按分数降序排序;
- 输出降序排名后的选手ID序列。
五、Java算法源码
java">public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.valueOf(sc.nextLine());
// 选手
int[] playerArr = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
// 分数
int[] scoreArr = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
// key:选手ID,value:每个选手的分数列表
Map<Integer, List<Integer>> listMap = new HashMap<>();
for (int i = 0; i < n; i++) {
int player = playerArr[i];
int score = scoreArr[i];
List<Integer> scoreList = listMap.getOrDefault(player, new ArrayList<>());
scoreList.add(score);
listMap.put(player, scoreList);
}
// key:选手ID,value:每个选手最高的3个分数之和
Map<Integer, Integer> map = new HashMap<>();
// 计算每个选手最高的3个分数之和
for (Map.Entry<Integer, List<Integer>> entry : listMap.entrySet()) {
List<Integer> scoreList = entry.getValue();
// 如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名忽略该选手
if (scoreList.size() < 3) {
continue;
}
// 对每个选手的分数进行降序排序
Collections.sort(scoreList, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
// 计算每个选手最高的3个分数之和
int sum = 0;
for (int i = 0; i < 3; i++) {
sum += scoreList.get(i);
}
map.put(entry.getKey(), sum);
}
// 按照每个选手最高的3个分数之和降序排序,如果分数相等,按选手ID序列降序排序,否则先按分数降序排序
List<Map.Entry<Integer, Integer>> mapList = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
Collections.sort(mapList, new Comparator<Map.Entry<Integer, Integer>>() {
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
if (o1.getValue().equals(o2.getValue())) {
return o2.getKey().compareTo(o1.getKey());
} else {
return o2.getValue().compareTo(o1.getValue());
}
}
});
// 输出降序排名后的选手ID序列
StringBuilder builder = new StringBuilder();
for (int i = 0; i < mapList.size(); i++) {
builder.append(mapList.get(i).getKey()).append(",");
}
System.out.println(builder.deleteCharAt(builder.length() - 1));
}
六、效果展示
1、输入
13
3,3,7,4,4,4,4,7,7,3,5,5,5
53,80,68,24,39,76,66,16,100,55,53,80,55
2、输出
5,3,7,4
3、说明
(1)统计每名选手分数
- 3号:53,80,55
- 7号:68,16,100
- 4号:24,39,76,66
- 5号:53,80,55
(2)计算每个选手最高的3个分数之和
- 3号:53,80,55 – 188
- 7号:68,16,100 – 184
- 4号:24,39,76,66 – 181
- 5号:53,80,55 – 188
(3)如果分数相等,按选手ID序列降序排序,否则先按分数降序排序
5号 – 188
3号 – 188
7号 – 184
4号 – 181
🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。