**小学生班长选举**

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 当选班长。

解题思路

本题是一个简单的选举计票问题,核心在于处理重名规则和票数统计

关键规则:

  1. 重名处理:首个同名学生用原名,后续用 "姓名 + 序号"
  2. 废票过滤:选票中的名字必须在候选人名单中
  3. 票数限制:总票数 > 学生数时选举无效
  4. 获胜判定:票数最高者获胜,相同则取字典序最小

算法步骤

  1. 输入验证:检查票数是否超过学生数
  2. 生成唯一候选人名单
    • 遍历学生名单,记录每个名字出现的次数
    • 首次出现用原名,后续出现用 "名字 + 出现序号"
  3. 统计有效票
    • 遍历投票列表
    • 只统计在候选人名单中的有效票
  4. 确定获胜者
    • 遍历候选人名单
    • 找出票数最高者
    • 票数相同时选择字典序更小的名字

复杂度分析

  • 时间复杂度:O(n + m),其中 n 是学生数,m 是票数
  • 空间复杂度:O(n + m)

正确性证明

定理:算法返回的结果符合题目所有规则。

证明

  1. 重名处理正确性:按出现顺序为每个同名学生分配唯一标识,满足规则1
  2. 废票过滤正确性:只统计在候选集中的票,满足规则2
  3. 票数验证正确性:在处理前检查票数限制,满足规则3
  4. 获胜判定正确性:遍历所有候选人选择票数最高且字典序最小的,满足规则
THE END