华为OD机试 - 选修课(Python/JS/C/C++ 2024 E卷 100分)

在这里插入图片描述

华为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

五、解题思路

  1. 将每门选修课的学生数据解析为学生学号和对应的成绩。输入的数据以 ; 号分隔不同学生的信息,每个学生的信息由学号和成绩组成。
  2. 我们需要找到同时存在于两门课程中的学生,即两个数据集合的交集。
  3. 根据学号前5位进行班级划分。班级编号小的先输出(按班级编号升序)。
  4. 同班学生的排序:先按两门课程成绩和的降序排列,如果成绩和相同,则按学号升序排列。
  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在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1542956.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言零基础入门篇 - 15】:单链表

文章目录 单链表链表的基本概念单链表功能的实现单链表的初始化单链表新结点的创建单链表头插法单链表的输出单链表的查找单链表修改单链表的删除单链表所有数据结点释放源代码 单链表 链表的基本概念 一、什么是链表&#xff1f; 链表是数据结构中线性表的一种&#xff0c;其…

华为OD机试 - 需要打开多少监控器(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…

软考高级:数据库保持函数依赖和有损无损分解 AI 解读

讲解 生活化例子 想象你经营着一家快餐店&#xff0c;店里有各种商品&#xff0c;你也记录了每天的销量。你有一个表格&#xff0c;记录了「商品名称」、「价格」、「库存数量」、「供应商信息」等数据。最开始&#xff0c;你可能把所有数据都写在一张表上&#xff0c;但时间…

2024年9月22日---关于MyBatis框架(1)

一 Mybatis概述 1.1 简介 MyBatis&#xff08;官网&#xff1a;mybatis – MyBatis 3 | 简介 &#xff09;是一款优秀的开源的 持久层 框架&#xff0c;用于简化JDBC的开发。是 Apache的一个开源项目iBatis&#xff0c;2010年这个项目由apache迁移到了google code&#xff0c…

PCL 随机下采样

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xff09; 一、概述 随机下采样 是一种常用的点…

类和对象(2)(重点)

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 类的默认成员函数 概念概述 默认成员函数就是用户没有显式实现&#xff0c;编译器会自…

项目扩展一:信道池的实现

项目扩展一&#xff1a;信道池的实现 一、为何要设计信道池1.引入信道的好处2.为何要设计信道池 二、信道池的设计1.服务器需要设计信道池吗&#xff1f;2.设计&#xff1a;动态变化的信道池1.为什么&#xff1f;2.怎么办&#xff1f;1.动态扩容和缩容2.LRU风格的信道置换3.小总…

0基础学习HTML(十三)布局

HTML 布局 网页布局对改善网站的外观非常重要。 请慎重设计您的网页布局。 如何使用 <table> 元素添加布局。 网站布局 大多数网站会把内容安排到多个列中&#xff08;就像杂志或报纸那样&#xff09;。 大多数网站可以使用 <div> 或者 <table> 元素来创建…

软件测试分类篇(下)

目录 一、按照测试阶段分类 1. 单元测试 2. 集成测试 3. 系统测试 3.1 冒烟测试 3.2 回归测试 4. 验收测试 二、按照是否手工测试分类 1. 手工测试 2. 自动化测试 3. 手工测试和自动化测试的优缺点 三、按照实施组织分类 1. α测试(Alpha Testing) 2. β测试(Beta…

【LTW】Domain General Face Forgery Detection by Learning to Weight

文章目录 Domain General Face Forgery Detection by Learning to Weightkey points方法LTW元分割策略学习过程损失函数实验评价结果消融实验总结Domain General Face Forgery Detection by Learning to Weight 会议:AAAI-21 作者: code: https://github.com/skJack/LTW 上…

理解JVM中的死锁:原因及解决方案

死锁是并发应用程序中的常见问题。在此类应用程序中&#xff0c;我们使用锁定机制来确保线程安全。此外&#xff0c;我们使用线程池和信号量来管理资源消耗。然而&#xff0c;在某些情况下&#xff0c;这些技术可能会导致死锁。 在本文中&#xff0c;我们将探讨死锁、死锁出现…

旋转机械故障诊断 震动故障分析与诊断

旋转机械故障诊断 机理资料整理 电气故障&#xff0c;机械故障(不平衡&#xff0c;不对中&#xff0c;松动&#xff0c;轴承&#xff0c;共振&#xff0c;流体振动&#xff0c;皮带松动)&#xff0c;低速与高速机器故障诊断等 旋转机械故障诊断&#xff1a;机理资料整理 目录…

河钢数字PMO牛红卫受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 河钢数字技术股份有限公司项目管理部PMO牛红卫受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“从技术到领导力——项目经理成长进阶之道”。大会将于10月26-27日在北京举办&…

数据结构——串的模式匹配算法(BF算法和KMP算法)

算法目的&#xff1a; 确定主串中所含子串&#xff08;模式串&#xff09;第一次出现的位置&#xff08;定位&#xff09; 算法应用&#xff1a; 搜索引擎、拼写检查、语言翻译、数据压缩 算法种类&#xff1a; BF算法&#xff08;Brute-Force&#xff0c;又称古典的…

NASA:ATLAS/ICESat-2 L3 B每周网格大气数据集V005

目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATLAS/ICESat-2 L3B Weekly Gridded Atmosphere V005 简介 该产品报告每周全球云覆盖率、海洋上总列光学深度、极地云覆盖率、风吹雪频率、视表面反照率以及地面探测频率。 参数&#xff1a;云光学…

Java 每日一刊(第15期):内部类

文章目录 前言内部类成员内部类&#xff08;Member Inner Class&#xff09;静态内部类&#xff08;Static Nested Class&#xff09;局部内部类&#xff08;Local Inner Class&#xff09;匿名内部类&#xff08;Anonymous Inner Class&#xff09; 内部类的详细对比内部类字节…

新增用户 开发

原型分析 接口设计 数据库设计 代码开发 controller /*** 新增员工** param employeeDTO* return*/ApiOperation("新增员工")PostMappingpublic Result<String> save(RequestBody EmployeeDTO employeeDTO) {log.info("新增员工&#xff1a;{}", emp…

C++离线查询

前言 C算法与数据结构 打开打包代码的方法兼述单元测试 概念及原理 离线算法( offline algorithms)&#xff0c;离线计算就是在计算开始前已知所有输入数据&#xff0c;输入数据不会产生变化&#xff0c;且在解决一个问题后就要立即得出结果的前提下进行的计算。 通俗的说&a…

智能优化算法-遗传算法(GA)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 遗传算法 (Genetic Algorithm, GA) 是一种基于自然选择和遗传学原理的元启发式优化算法&#xff0c;它模仿了生物进化过程中的选择、交叉和变异操作来搜索最优解。 GA的工作机制主要包括&#xff1a; 选择&am…

73 矩阵置零

解题思路&#xff1a; \qquad 原地算法&#xff0c;指除原有输入资料所占空间外&#xff0c;使用额外空间尽可能少(常数空间)的算法。本题容易想到的一种解法是&#xff0c;对于m x n的矩阵&#xff0c;一次遍历把含有0元素的行号、列号记录下来&#xff0c;然后再一次遍历把对…