小学生班长选举增强版
2026 华为OD机试真题 4月22日华为OD上机新系统考试真题 200 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
9月份开学第一天,小学某班级进行班长选举活动,班级共有$N$个学生,每个学生最多可投$3$票(对同一个人只能投一票),也可以弃权不投票,大家投票时写上对应学生的名字(假设学生不存在重名,考虑到部分少数民族名字带分隔,且整体较长,同学在投票时为了方便,允许同学写全称,也可以只写其中的部分连续段,比如班级里只有$2$个少数民族名称带点的同学,$A$同学叫买买提-艾尔肯-巴图尔,$B$同学叫买买提-艾尔肯-库尔班,那要给$A$同学投票,可以写 买买提-艾尔肯-巴图尔 或者 艾尔肯-巴图尔 或者 巴图尔,但是不能写 买买、买买提-艾、肯-库尔班、肯-库这种某名字未写全的情况),学生可以把票投给自己。
得票最多的同学当选班长,如果票数相同,则按名字做字符串排序,排序靠前的当选班长。
如果选票上写的名字不合理(要求投票的名字必需是连续的,少数民族可以是连续的若干段,但要求每段名称要写全,选票上的名字需要能唯一匹配某个人),则认为是无效票,直接忽略。
如果出现原始输入总选票数超过$3$倍班级总人数、某位同学的得票数超过班级总人数、没有一个同学被选中这些情况,则认为选举无效,返回固定字符串 "Invalid election."。
现在投票环节已完成,进入唱票环节,请你完善代码根据投票数据,给出当选班长对应的完整名称。 方法共$2$个参数,第一个参数是全班同学的名称集合,第二个参数是选票数据集合。
考虑到部分语言对中文处理不太友好,名称输入统一为普通的ASCII字符,选票中少数民族名称中的连接符($\cdot$)改用英文横杠连接符($-$)。
输入描述
输入为一行,包含两个参数,分别是全班同学的名称集合和选票数据集合,以逗号分隔。每个集合用方括号 [] 包围,元素用双引号 "" 包围并以逗号分隔。
例如:["Zhangsan", "Lisi", "Wangwu"],["Zhangsan", "Lisi", "Zhangsan"]
输出描述
当选班长的完整名称
示例1
输入
["Zhangsan", "Lisi", "Wangwu"],["Zhangsan", "Lisi", "Zhangsan"]
输出
Zhangsan
说明
Zhangsan得$2$张选票,Lisi只得$1$张选票,Zhangsan票数更高,因此Zhangsan当选班长。
示例2
输入
["Zhangsanfeng", "Zhangsande"],["Zhangsan", "Zhangsande", "Zhangsan"]
输出
Zhangsande
说明
虽然Zhangsan有$2$张选票,由于不属于班级成员,对应选票无效,因此获得$1$张选票的Zhangsande当选班长。
示例3
输入
["maimaiti-aierken-batuer", "maimaiti-aierken-kuerban"],["batuer", "aierken-batuer", "maimaiti", "maimaiti-aierken-kuerban"]
输出
maimaiti-aierken-batuer
说明
"batuer"和"aierken-batuer"都能唯一匹配"maimaiti-aierken-batuer",因此"maimaiti-aierken-batuer"获得$2$票,"maimaiti"因为有多个名字都匹配,认定为无效票。"maimaiti-aierken-kuerban"能唯一匹配,获得$1$票,所以得票更多的"maimaiti-aierken-batuer"当选班长。
解题思路
核心思想
-
预处理名字匹配映射:
- 为了快速判断选票上的名字是否能唯一匹配某个学生,我们可以对全班每个学生的名字进行预处理。
- 每个名字按连字符
-分割成若干段。合法的缩写必须是这些段的连续组合(例如A-B-C的合法缩写有A,B,C,A-B,B-C,A-B-C)。 - 使用一个哈希表
mapping记录每个合法的缩写对应的完整名字。 - 如果一个缩写对应多个不同的完整名字,则在哈希表中标记为无效(例如
#INVALID#),表示存在歧义。
-
投票规则校验:
- 总票数校验:总选票数不能超过全班人数 $N$ 的 3 倍。
- 唯一匹配校验:选票上的名字必须在
mapping中存在且不具有歧义。 - 得票数校验:统计每位学生的有效得票数,任何一位学生的得票数不能超过全班总人数 $N$。
- 空选举校验:如果没有产生任何有效选票,选举无效。
-
确定当选者:
- 在所有获得有效选票的学生中,选出得票数最多的。
- 如果票数相同,则按照名字的字典序进行升序排序,选择排序靠前者。
复杂度分析
- 时间复杂度:$O(N \cdot M^2 + T)$,其中 $N$ 是学生人数,$M$ 是名字的最大分段数(通常很小),$T$ 是选票总数。预处理每个名字的连续段需要 $O(M^2)$,处理所有选票需要 $O(T)$。
- 空间复杂度:$O(N \cdot M^2)$,用于存储名字缩写映射的哈希表。