华为OD机考双机位C卷 - 明日之星选举 (Java & Python & JS & GO & C++ & C)
# 明日之星选举
2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷
华为OD机试双机位C卷真题目录点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)
题目描述
给定一组选票votes[],vote[i]代表第i张选票的内容,包含一个字符串"zhangsan,hanmei",表示推荐zhangsan成为明日之星,反对hanmei成为明日之星。赞成或返回使用逗号(,)分割。
给定一个数组n,表示最后将筛选赞成票最多的n个人,如果赞成票相同,则反对票越少,排序越靠前;如果赞成票和反对票都相同,则按照姓名字典序升序排序。
注意:
1 <= votes.length <= 5001 <= votes[i].length <= 20- vote[i]由小写字母和逗号组成,且最多只有一个逗号。
- vote[i]中赞成票必选,反对票可选。
- n的取值范围为[1, 不同姓名的数量]
输入描述
第一行输入为M,表示选票的数量,其中1 <= M <= 500
接下来M行为选票具体内容
最后一行输入为N,表示最终当选明日之星的人员个数1 <= N <= 不同姓名的数量
输出描述
输出一个字符串,返回当选的N个人的姓名,顺序排列,逗号分割。
示例1
输入
6
zhangsan,hanmei
zhangsan,lisi
lisi
lisi
wangwu
hanmei
2
输出
zhangsan,lisi
说明
示例2
输入
4
zhangsan,lisi
lisi,wangwu
wangwu,qianliu
qianliu,zhangsan
2
输出
lisi,qianliu
说明
zhangsan:1赞成,1反对
lisi:1赞成,1反对
wangwu:1赞成,1反对
qianliu:1赞成,1反对
票数情况相同,按照字典序升序,返回lisi,qianliu
解题思路
1) 抽象问题与数据口径
- 每条投票是一个字符串:
- 只有一个名字:表示该名字获得 1 票赞成。
- 形如
A,B:表示A获得 1 票赞成,同时B获得 1 票反对。
- 同一个名字可能在不同投票中既出现为赞成对象,也出现为反对对象;两种票数都要分别累计。
- 候选名单取所有在任意投票中出现过的名字(赞成或反对出现都算)。
2) 统计策略
为每个名字维护两项计数:
赞成票数反对票数
处理每条投票时:
- 判断是否包含分隔符(逗号):
- 若有:分成左右两段名字
A和B,分别做:A.赞成++B.反对++
- 若无:整条就是名字
A,做:A.赞成++
- 若有:分成左右两段名字
- 任何名字第一次出现时,都要在统计结构中“建档”,初始两项计数为 0。
实务细节(输入更健壮)
对切分后的名字做去首尾空格,避免"Alice, Bob"把Bob统计成带空格的不同名字。
3) 排序规则(关键)
将所有名字按以下优先级排序:
- 赞成票数:从大到小(降序)
- 反对票数:从小到大(升序)
- 名字字典序:从小到大(升序,用于前两项完全相同时打破平局)
4) 输出规则
- 排序后取前
N个名字。 - 按要求用逗号连接输出(如:
name1,name2,name3)。 - 若
N大于总人数,则输出全部名字。
这套方法的核心就是:双计数统计 + 按(赞成降、反对升、字典升)的多关键字排序 + 取前 N 输出。
浙公网安备 33010602011771号