华为OD机试真题 新系统 2026-04-22 C语言 实现【小学生班长选举增强版】
目录题目思路Code题目9 月份开学第一天小学某班级进行班长选举活动班级共有 N 个学生每个学生最多可投 3 票对同一个人只能投一票也可以弃权不投票大家投票时写上对应学生的名字。假设学生不存在重名。考虑到部分少数民族名字带分隔且整体较长同学在投票时为了方便允许同学写全称也可以只写其中的部分连续段。例如班级里只有 2 个少数民族名称带点的同学A 同学叫 买买提-艾尔肯-巴图尔B 同学叫 买买提-艾尔肯-库尔班那么要给 A 同学投票可以写买买提-艾尔肯-巴图尔艾尔肯-巴图尔巴图尔但不能写买买买买提-艾肯-库尔班肯-库也就是要求投票写的名字必须是合法的连续片段对于带 - 的名字可以是连续的若干段但每一段名称都必须写全。学生也可以把票投给自己。得票最多的同学当选班长如果票数相同则按名字做字符串排序排序靠前的当选班长。如果选票上写的名字不合理则该票作废直接忽略。作废条件投票的名字必须是连续的少数民族名字可以是连续的若干段但每段名称都要写全选票上的名字需要能唯一匹配某个人否则视为无效票如果出现以下任一情况则认为选举无效返回固定字符串 Invalid election.原始输入总选票数超过 3 * 班级总人数某位同学的得票数超过班级总人数没有任何一个同学被选中现在投票环节已完成进入唱票环节请根据投票数据给出当选班长对应的完整名称。方法共 2 个参数全班同学的名称集合选票数据集合补充说明名称输入统一为普通的 ASCII 字符选票中少数民族名称中的连接符 · 改用英文横杠 -示例1输入[张三,李四,王五,买买提-艾尔肯-巴图尔,买买提-艾尔肯-库尔班][张三,李四,王五,买买提-艾尔肯-巴图尔,艾尔肯-巴图尔,巴图尔,买买提-艾尔肯-库尔班,艾尔肯-库尔班,库尔班,买买提-艾尔肯,买买提,艾尔肯,买买,艾尔肯-巴,赵六]输出买买提-艾尔肯-巴图尔说明有效票统计结果为张三1票李四1票王五1票买买提-艾尔肯-巴图尔3票买买提-艾尔肯-库尔班3票其中买买提-艾尔肯-巴图尔、艾尔肯-巴图尔、巴图尔 可以唯一匹配到 买买提-艾尔肯-巴图尔买买提-艾尔肯-库尔班、艾尔肯-库尔班、库尔班 可以唯一匹配到 买买提-艾尔肯-库尔班买买提-艾尔肯、买买提、艾尔肯 都会匹配到两个人因此是无效票买买、艾尔肯-巴 不是合法连续完整片段因此是无效票赵六 无法匹配任何人因此是无效票最终最高票数为 3 票有两人并列。按字符串排序买买提-艾尔肯-巴图尔 排在前面因此当选。思路逻辑模拟类题目先预处理所有合法写法再逐张验票即可对每个同学的完整姓名生成所有合法投票片段。建立一个映射投票写法 - 能匹配到的完整姓名列表对每张票如果能唯一匹配一个同学则记为该同学的有效票如果匹配不到或匹配到多个人都算无效票最后检查选举是否合法总票数不能超过 3 * N任意同学得票不能超过 N至少要有人得票若合法则从最高票者中按字符串排序选最小的那个名字。Code#include stdio.h #include string.h #include stdlib.h #define MAX_STUDENTS 1000 #define MAX_VOTES 3000 #define MAX_NAME_LEN 256 #define MAX_FRAGMENTS 20000 typedef struct { char data[MAX_STUDENTS][MAX_NAME_LEN]; int size; } StringList; typedef struct { char fragment[MAX_NAME_LEN]; char names[MAX_STUDENTS][MAX_NAME_LEN]; int count; } FragmentMapItem; typedef struct { char name[MAX_NAME_LEN]; int count; } VoteItem; void split_name(const char *name, char parts[][MAX_NAME_LEN], int *part_count) { *part_count 0; char temp[MAX_NAME_LEN]; strcpy(temp, name); char *token strtok(temp, -); while (token ! NULL) { strcpy(parts[*part_count], token); (*part_count); token strtok(NULL, -); } } void build_valid_fragments(const char *name, StringList *fragments) { char parts[100][MAX_NAME_LEN]; int part_count 0; split_name(name, parts, part_count); fragments-size 0; // 普通名字只能写全名 if (part_count 1) { strcpy(fragments-data[fragments-size], name); return; } // 枚举所有连续的完整段 for (int i 0; i part_count; i) { char current[MAX_NAME_LEN] ; for (int j i; j part_count; j) { if (strlen(current) 0) { strcat(current, -); } strcat(current, parts[j]); strcpy(fragments-data[fragments-size], current); } } } int find_fragment(FragmentMapItem fragment_map[], int fragment_map_size, const char *fragment) { for (int i 0; i fragment_map_size; i) { if (strcmp(fragment_map[i].fragment, fragment) 0) { return i; } } return -1; } int find_vote_item(VoteItem vote_count[], int vote_count_size, const char *name) { for (int i 0; i vote_count_size; i) { if (strcmp(vote_count[i].name, name) 0) { return i; } } return -1; } void parse_list(char *line, StringList *result) { result-size 0; int len strlen(line); if (len 2) { return; } char current[MAX_NAME_LEN] ; int current_len 0; int in_string 0; for (int i 0; i len; i) { if (line[i] ) { if (in_string) { current[current_len] \0; strcpy(result-data[result-size], current); current_len 0; in_string 0; } else { in_string 1; } } else if (in_string) { current[current_len] line[i]; } } } void elect_monitor(StringList *names, StringList *votes, char *result) { int n names-size; // 总票数不能超过 3 * 班级人数 if (votes-size 3 * n) { strcpy(result, Invalid election.); return; } // 记录每种合法写法能匹配到哪些同学 FragmentMapItem fragment_map[MAX_FRAGMENTS]; int fragment_map_size 0; for (int i 0; i names-size; i) { StringList fragments; build_valid_fragments(names-data[i], fragments); for (int j 0; j fragments.size; j) { int idx find_fragment(fragment_map, fragment_map_size, fragments.data[j]); if (idx -1) { idx fragment_map_size; strcpy(fragment_map[idx].fragment, fragments.data[j]); fragment_map[idx].count 0; } strcpy(fragment_map[idx].names[fragment_map[idx].count], names-data[i]); } } // 统计有效票 VoteItem vote_count[MAX_STUDENTS]; int vote_count_size 0; for (int i 0; i votes-size; i) { int idx find_fragment(fragment_map, fragment_map_size, votes-data[i]); if (idx ! -1 fragment_map[idx].count 1) { char *chosen_name fragment_map[idx].names[0]; int vote_idx find_vote_item(vote_count, vote_count_size, chosen_name); if (vote_idx -1) { vote_idx vote_count_size; strcpy(vote_count[vote_idx].name, chosen_name); vote_count[vote_idx].count 0; } vote_count[vote_idx].count; } } // 某位同学得票数超过班级人数 for (int i 0; i vote_count_size; i) { if (vote_count[i].count n) { strcpy(result, Invalid election.); return; } } // 没有任何一个同学被选中 if (vote_count_size 0) { strcpy(result, Invalid election.); return; } // 选出票数最多的人若并列取字符串排序最小的 int max_votes 0; for (int i 0; i vote_count_size; i) { if (vote_count[i].count max_votes) { max_votes vote_count[i].count; } } char candidates[MAX_STUDENTS][MAX_NAME_LEN]; int candidate_size 0; for (int i 0; i vote_count_size; i) { if (vote_count[i].count max_votes) { strcpy(candidates[candidate_size], vote_count[i].name); } } for (int i 0; i candidate_size; i) { for (int j i 1; j candidate_size; j) { if (strcmp(candidates[i], candidates[j]) 0) { char temp[MAX_NAME_LEN]; strcpy(temp, candidates[i]); strcpy(candidates[i], candidates[j]); strcpy(candidates[j], temp); } } } strcpy(result, candidates[0]); } void solve() { // 读取两行输入格式都是字符串数组 char names_line[100000]; char votes_line[100000]; fgets(names_line, sizeof(names_line), stdin); fgets(votes_line, sizeof(votes_line), stdin); names_line[strcspn(names_line, \n)] \0; votes_line[strcspn(votes_line, \n)] \0; StringList names, votes; parse_list(names_line, names); parse_list(votes_line, votes); char result[MAX_NAME_LEN]; elect_monitor(names, votes, result); printf(%s\n, result); } int main() { solve(); return 0; }【华为od机试真题PythonJSJavaGo合集】【超值优惠】Py/JS/Java/Go合集【华为od机试真题Python】Python真题题库【华为od机试真题JavaScript】JavaScript真题题库【华为od机试真题JavaGo】JavaGo真题题库【华为od机试真题C】C真题题库【华为od机试真题C语言】C语言真题题库【华为od面试手撕代码题库】面试手撕代码题库【华为od机试面试交流群830285880】【文章底部有二维码链接可扫码加交流群】华为OD机试:二本院校有机会吗?有机会,但不大,大神除外!机考分数越高越好,所以需要提前刷题。机考通过后,如果没有收到面试邀请,也不要着急,非目标院校面试邀请发的时间比较晚。非目标院校今年有点难,机试至少要考到350分,所以需要疯狂刷题,华为OD机考是有题库的,最好在考前完所有题库题目。华为OD机试:跨专业可以参加华为OD可以,但是如果你的本科院校比较差,上岸概率不大。华为OD机试:华为OD简历被锁定机试通过,性格测试也通过,但是没人联系面试,发现简历被锁定。此时需要主动去联系HR。让他帮助你查询原因。