**小学生班长选举**
2026 华为OD机试真题 5月27日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
9 月份开学,小学某班级要举行班长选举,全班 1 人 1 票把心目中的班长人选姓名写在投票纸上。最终得票最多的当选班长,如果票数相等,按姓名字母顺序靠前的人当选班长。
投票约定:
1、若学生间存在重名,首个同学按原名,后面的携带 +n 编号,例如李伟,李伟 1,李伟 2。
2、若选票中书写的名字不存在,视为废票(也适用于约定 1)。
3、若出现票数多于全班人数,本次票选无效,即选举失败。
4、若有人当选则认为选举成功,没人当选,则认为选举失败。
2026 华为OD机试真题 5月27日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
输入描述
1、全班学生姓名字符串集合。
2、全部投票数据字符串集合。
输出描述
1、若选举成功,给出班长的姓名(重名的情况需要按照上面约定 1 输出)。
2、若选举失败,返回 "Invalid election."
示例1
输入
["Zhangsan", "Lisi", "Wangwu"],["Zhangsan", "Lisi", "Zhangsan"]
输出
Zhangsan
说明
3 个同学中 Zhangsan 得了2 票,Lisi 得 1 票,Zhangsan 票数最高,因此当选班长。
示例2
输入
["Zhangsan", "Lisi", "Wangwu"],["Zhangsan", "Zhaoliu", "Zhaoliu"]
输出
Zhangsan
说明
Zhangsan 得 1 票,Zhaoliu 得了 2 票,但是并不是班集成员,因而 Zhaoliu 的选票无效,Zhangsan 当选班长。
示例3
输入
["Zhangsan", "Lisi", "Wangwu", "Zhangsan"],["Zhangsan0", "Zhangsan0", "Zhangsan1", "Zhangsan0"]
输出
Zhangsan1
说明
存在重名的 Zhangsan,按规则投票时,前后 2 个张三分别需要写 Zhangsan 和 Zhangsan1。而实际投票有 3 票是 Zhangsan0,1 票 Zhangsan1,由于 Zhangsan0 是不规范的选票,因此 Zhangsan1 当选班长。
解题思路
本题是一个简单的选举计票问题,核心在于处理重名规则和票数统计。
关键规则:
- 重名处理:首个同名学生用原名,后续用 "姓名 + 序号"
- 废票过滤:选票中的名字必须在候选人名单中
- 票数限制:总票数 > 学生数时选举无效
- 获胜判定:票数最高者获胜,相同则取字典序最小
算法步骤
- 输入验证:检查票数是否超过学生数
- 生成唯一候选人名单:
- 遍历学生名单,记录每个名字出现的次数
- 首次出现用原名,后续出现用 "名字 + 出现序号"
- 统计有效票:
- 遍历投票列表
- 只统计在候选人名单中的有效票
- 确定获胜者:
- 遍历候选人名单
- 找出票数最高者
- 票数相同时选择字典序更小的名字
复杂度分析
- 时间复杂度:O(n + m),其中 n 是学生数,m 是票数
- 空间复杂度:O(n + m)
正确性证明
定理:算法返回的结果符合题目所有规则。
证明:
- 重名处理正确性:按出现顺序为每个同名学生分配唯一标识,满足规则1
- 废票过滤正确性:只统计在候选集中的票,满足规则2
- 票数验证正确性:在处理前检查票数限制,满足规则3
- 获胜判定正确性:遍历所有候选人选择票数最高且字典序最小的,满足规则