java解法

输入数据处理:

输入包含两行数据,分别代表两门课程的成绩,格式为 学生ID,成绩;学生ID,成绩;…。
每个学生有一个唯一的学生ID(sid),每门课程成绩都有可能被录入。如果学生的两门课程成绩都已经有记录,则该学生满足输出条件。
数据存储:

使用一个 Map 来存储学生数据,键是学生ID,值是学生对象。
学生对象 Student 中包含 sid(学生ID)、score1(第一门课程成绩)、score2(第二门课程成绩),并提供 getTotalScore() 方法来计算该学生两门课程成绩的总和。
课程分组:

对于每个学生,如果该学生两门课程成绩都已录入,则将其按课程ID分组(课程ID由学生ID的前五个字符来决定),并存入一个 Map(课程ID到学生列表的映射)中。
排序:

对每门课程的学生列表按照以下规则进行排序:
按两门课程的总成绩(score1 + score2)降序排序
如果总成绩相同,则按学生ID字典序升序排序。
输出结果:

对每个课程,按课程ID升序输出,接着输出该课程下按排序规则排列的学生ID列表。如果没有符合条件的学生,输出 “NULL”

import java.util.*;

public class Main {
    // 学生类,用于存储学生的成绩信息
    static class Student {
        String sid;  // 学生ID
        int score1 = -1;  // 第一门课程成绩,初始化为-1,表示未评分
        int score2 = -1;  // 第二门课程成绩,初始化为-1,表示未评分

        // 计算学生的总成绩
        public int getTotalScore() {
            return score1 + score2;
        }
    }

    public static void main(String[] args) {
        // 创建扫描器对象,用于接收输入
        Scanner scanner = new Scanner(System.in);

        // 读取两门课程的成绩数据
        String s1 = scanner.nextLine();  // 第一门课程的成绩数据
        String s2 = scanner.nextLine();  // 第二门课程的成绩数据

        // 调用 findCommonStudents 方法,查找有成绩的学生,并输出结果
        findCommonStudents(s1, s2);
    }

    // 找到有两门课程成绩的学生并按照要求输出
    private static void findCommonStudents(String s1, String s2) {
        // 存储所有学生的成绩信息
        Map<String, Student> students = new HashMap<>();

        // 处理第一门课程的成绩数据
        processInput(s1, students, 1);
        // 处理第二门课程的成绩数据
        processInput(s2, students, 2);

        // 存储课程ID到学生列表的映射
        Map<String, List<Student>> classMap = new TreeMap<>();

        // 对所有学生进行处理,找出有两门课程成绩的学生,并按课程ID分组
        for (Student student : students.values()) {
            // 只有两门课程都已经有成绩的学生才会被处理
            if (student.score1 != -1 && student.score2 != -1) {
                // 获取学生的课程ID(取学生ID的前五个字符)
                String classId = student.sid.substring(0, 5);
                // 初始化课程ID对应的学生列表
                classMap.putIfAbsent(classId, new ArrayList<>());
                // 将学生加入对应课程ID的列表中
                classMap.get(classId).add(student);
            }
        }

        // 如果没有符合条件的学生,输出 "NULL"
        if (classMap.isEmpty()) {
            System.out.println("NULL");
        } else {
            // 对每个课程ID,按要求输出学生列表
            for (String classId : classMap.keySet()) {
                // 输出课程ID
                System.out.println(classId);

                // 获取该课程ID下的所有学生列表
                List<Student> classStudents = classMap.get(classId);

                // 按总成绩降序排序,如果总成绩相同,则按学生ID升序排序
                classStudents.sort((a, b) -> {
                    // 比较总成绩,降序排列
                    int compare = Integer.compare(b.getTotalScore(), a.getTotalScore());
                    // 如果总成绩相同,按学生ID字典序升序排列
                    return compare != 0 ? compare : a.sid.compareTo(b.sid);
                });

                // 使用 StringJoiner 格式化输出学生ID,学生ID之间用分号分隔
                StringJoiner sj = new StringJoiner(";");
                for (Student student : classStudents) {
                    sj.add(student.sid);
                }

                // 输出该课程的所有学生ID
                System.out.println(sj);
            }
        }
    }

    // 处理输入数据并填充学生成绩信息
    private static void processInput(String input, Map<String, Student> students, int courseId) {
        // 按照分号分隔每个学生的成绩数据
        for (String entry : input.split(";")) {
            // 按逗号分隔学生ID和成绩
            String[] parts = entry.split(",");
            String sid = parts[0];  // 学生ID
            int score = Integer.parseInt(parts[1]);  // 学生成绩

            // 如果学生尚未存在于 students 中,则创建并初始化该学生
            students.putIfAbsent(sid, new Student());
            Student student = students.get(sid);
            student.sid = sid;  // 设置学生ID

            // 根据课程ID设置对应的成绩
            if (courseId == 1) {
                student.score1 = score;  // 设置第一门课程成绩
            } else {
                student.score2 = score;  // 设置第二门课程成绩
            }
        }
    }
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C++解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

JS解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/145099076"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!