华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
现有两门选修课,每门选修课都有一部分学生选修,每个学生都有选修课的成绩。需要你找出同时选修了两门选修课的学生,先按照班级进行划分,班级编号小的先输出。每个班级按照两门选修课成绩和的降序排列,成绩相同的按学生的学号升序排序。
二、输入描述
第一行为第一门选修课学生的成绩,第二行为第二门选修课学生的成绩。每行数据中学生之间以英文逗号分隔,每个学生的学号和成绩以英文逗号分隔。每个学生学号的格式为8位数字(2位院系编号+入学年份后2位+院系内部1位专业编号+所在班级3位学号),学生成绩的取值范围为[0, 100]之间的整数,两门选修课选修学生的学号的取值范围为[1-2000]之间的整数。
三、输出描述
同时选修了两门选修课的学生的学号,如果没有同时选修两门选修课的学生输出NULL,否则按班级照班级划分,班级编号小的先输出,每个班级先按班级编号输出班级编号(学号前五位),然后另起一行输出这个班级内同时选修了两门选修课的学生学号,学号按照要求排序(按照两门选修课成绩和的降序,成绩相同按学号升序),学生之间以英文逗号分隔。
四、测试用例
测试用例1:
1、输入
01202021,75;01201033,95;01202008,80;01203006,90;01203088,100
01202008,70;01203088,85;01202111,80;01202021,75;01201100,88
2、输出
01202
01202008;01202021
01203
01203088
3、说明
同时选修了两门选修课的学生01202021、01202008、01203088,这三个学生两门选修课的成绩和分别为150、150、185。01202021、01202008属于01202班的学生,按照成绩和降序,成绩相同时按学号升序输出的结果为01202008;01202021,01203088属于01203班的学生,按照成绩和降序,成绩相同时按学号升序输出的结果为01203088,01202的班级编号小于01203的班级编号,需要先输出。
测试用例2:
1、输入
01201022,75;01202033,95;01202018,80;01203006,90;01202066,100
01202008,70;01203102,85;01202111,80;01201021,75;01201100,88
2、输出
NULL
3、说明
没有同时选修了两门选修课的学生,输出NULL
五、解题思路
- 将每门选修课的学生数据解析为学生学号和对应的成绩。输入的数据以 ; 号分隔不同学生的信息,每个学生的信息由学号和成绩组成。
- 我们需要找到同时存在于两门课程中的学生,即两个数据集合的交集。
- 根据学号前5位进行班级划分。班级编号小的先输出(按班级编号升序)。
- 同班学生的排序:先按两门课程成绩和的降序排列,如果成绩和相同,则按学号升序排列。
- 如果没有任何学生同时选修两门课程,则输出 NULL。
六、Python算法源码
def main():# 从控制台获取输入course1 = input()course2 = input()# 处理课程数据process_courses(course1, course2)def process_courses(course1, course2):# 存储学生成绩course1_map = parse_input(course1)course2_map = parse_input(course2)# 存储同时选修两门课的学生成绩和common_students = {}# 查找同时选修两门课程的学生for student_id in course1_map:if student_id in course2_map:# 计算两门课程的成绩和total_score = course1_map[student_id] + course2_map[student_id]common_students[student_id] = total_scoreif not common_students:# 如果没有同时选修两门课的学生print("NULL")return# 按班级划分学生class_map = {}for student_id in common_students:class_id = student_id[:5] # 提取班级编号if class_id not in class_map:class_map[class_id] = []class_map[class_id].append(student_id)# 输出每个班级的学生,按照成绩和降序排列,成绩相同按学号升序for class_id in sorted(class_map.keys()):students = class_map[class_id]students.sort(key=lambda x: (-common_students[x], x)) # 成绩降序,学号升序print(class_id)print(";".join(students))# 解析输入,将每门选修课学生的学号和成绩存入字典
def parse_input(input_data):result = {}students = input_data.split(';')for student in students:parts = student.split(',')student_id = parts[0]score = int(parts[1])result[student_id] = scorereturn result# 运行主函数
if __name__ == '__main__':main()
七、JavaScript算法源码
function main() {const readline = require('readline');const rl = readline.createInterface({input: process.stdin,output: process.stdout});let inputs = [];rl.on('line', function (line) {inputs.push(line);if (inputs.length === 2) {// 当输入了两行数据时,开始处理课程数据processCourses(inputs[0], inputs[1]);rl.close();}});
}function processCourses(course1, course2) {// 存储学生成绩const course1Map = parseInput(course1);const course2Map = parseInput(course2);// 存储同时选修两门课的学生成绩和const commonStudents = {};// 查找同时选修两门课程的学生for (const studentId in course1Map) {if (course2Map.hasOwnProperty(studentId)) {// 计算两门课程的成绩和const totalScore = course1Map[studentId] + course2Map[studentId];commonStudents[studentId] = totalScore;}}if (Object.keys(commonStudents).length === 0) {// 如果没有同时选修两门课的学生console.log("NULL");return;}// 按班级划分学生const classMap = {};for (const studentId in commonStudents) {const classId = studentId.substring(0, 5); // 提取班级编号if (!classMap.hasOwnProperty(classId)) {classMap[classId] = [];}classMap[classId].push(studentId);}// 输出每个班级的学生,按照成绩和降序排列,成绩相同按学号升序const sortedClasses = Object.keys(classMap).sort();sortedClasses.forEach(classId => {const students = classMap[classId];students.sort((a, b) => {const scoreA = commonStudents[a];const scoreB = commonStudents[b];if (scoreA !== scoreB) {return scoreB - scoreA; // 成绩降序}return a.localeCompare(b); // 学号升序});console.log(classId);console.log(students.join(';'));});
}// 解析输入,将每门选修课学生的学号和成绩存入字典
function parseInput(input) {const result = {};const students = input.split(';');students.forEach(student => {const [studentId, score] = student.split(',');result[studentId] = parseInt(score, 10);});return result;
}// 运行主函数
main();
八、C算法源码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct {char student_id[20];int score;
} Student;void process_courses(char* course1, char* course2);
Student* parse_input(char* input, int* size);int main() {char course1[1000], course2[1000];// 从控制台获取输入fgets(course1, sizeof(course1), stdin);fgets(course2, sizeof(course2), stdin);// 处理课程数据process_courses(course1, course2);return 0;
}void process_courses(char* course1, char* course2) {int size1, size2;// 存储学生成绩Student* course1_map = parse_input(course1, &size1);Student* course2_map = parse_input(course2, &size2);// 查找同时选修两门课程的学生for (int i = 0; i < size1; i++) {for (int j = 0; j < size2; j++) {if (strcmp(course1_map[i].student_id, course2_map[j].student_id) == 0) {// 打印同时选修的学生及其成绩和printf("%s, total score: %d\n", course1_map[i].student_id, course1_map[i].score + course2_map[j].score);}}}free(course1_map);free(course2_map);
}// 解析输入,将每门选修课学生的学号和成绩存入结构体数组
Student* parse_input(char* input, int* size) {char* token;char* rest = input;int count = 0;// 计算学生数量while ((token = strtok_r(rest, ";", &rest))) {count++;}*size = count;Student* students = (Student*)malloc(count * sizeof(Student));// 解析每个学生rest = input;int index = 0;while ((token = strtok_r(rest, ";", &rest))) {sscanf(token, "%[^,],%d", students[index].student_id, &students[index].score);index++;}return students;
}
九、C++算法源码
#include <iostream>
#include <map>
#include <vector>
#include <sstream>
#include <algorithm>using namespace std;// 解析输入,将每门选修课学生的学号和成绩存入Map
map<string, int> parseInput(const string &input) {map<string, int> result;stringstream ss(input);string student;// 按照";"分隔每个学生记录while (getline(ss, student, ';')) {stringstream studentSS(student);string studentId;int score;// 按照","分隔学号和成绩getline(studentSS, studentId, ',');studentSS >> score;result[studentId] = score;}return result;
}void processCourses(const string &course1, const string &course2) {// 存储学生成绩map<string, int> course1Map = parseInput(course1);map<string, int> course2Map = parseInput(course2);// 存储同时选修两门课的学生成绩和map<string, int> commonStudents;for (const auto &entry : course1Map) {const string &studentId = entry.first;if (course2Map.count(studentId)) {// 计算两门课程的成绩和int totalScore = entry.second + course2Map[studentId];commonStudents[studentId] = totalScore;}}if (commonStudents.empty()) {// 如果没有同时选修两门课的学生cout << "NULL" << endl;return;}// 按班级划分学生map<string, vector<string>> classMap;for (const auto &entry : commonStudents) {string classId = entry.first.substr(0, 5); // 提取班级编号classMap[classId].push_back(entry.first);}// 输出每个班级的学生,按照成绩和降序排列,成绩相同按学号升序for (const auto &entry : classMap) {const string &classId = entry.first;vector<string> students = entry.second;sort(students.begin(), students.end(), [&](const string &a, const string &b) {int scoreA = commonStudents[a];int scoreB = commonStudents[b];if (scoreA != scoreB) {return scoreB < scoreA; // 成绩和降序}return a < b; // 学号升序});cout << classId << endl;for (const auto &studentId : students) {cout << studentId << ";";}cout << endl;}
}int main() {string course1, course2;// 从控制台获取输入getline(cin, course1);getline(cin, course2);// 处理课程数据processCourses(course1, course2);return 0;
}
🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)
🏆本文收录于,华为OD机试真题(Python/JS/C/C++)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。