华为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 <= 500
  • 1 <= 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) 统计策略

为每个名字维护两项计数:

  • 赞成票数
  • 反对票数

处理每条投票时:

  • 判断是否包含分隔符(逗号):
    • 若有:分成左右两段名字 AB,分别做:
      • A.赞成++
      • B.反对++
    • 若无:整条就是名字 A,做:
      • A.赞成++
  • 任何名字第一次出现时,都要在统计结构中“建档”,初始两项计数为 0。

实务细节(输入更健壮)
对切分后的名字做去首尾空格,避免 "Alice, Bob"Bob 统计成带空格的不同名字。

3) 排序规则(关键)

将所有名字按以下优先级排序:

  1. 赞成票数:从大到小(降序)
  2. 反对票数:从小到大(升序)
  3. 名字字典序:从小到大(升序,用于前两项完全相同时打破平局)

4) 输出规则

  • 排序后取前 N 个名字。
  • 按要求用逗号连接输出(如:name1,name2,name3)。
  • N 大于总人数,则输出全部名字。

这套方法的核心就是:双计数统计 + 按(赞成降、反对升、字典升)的多关键字排序 + 取前 N 输出

posted @ 2026-03-12 20:24  华为od算法大师  阅读(2)  评论(0)    收藏  举报