**省超足球比赛获胜队伍计算**
2026 华为OD机试真题 7月4日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
江苏省举办省级足球超级联赛,以市为单位参赛。请根据给定的比赛结果,输出获得冠军、亚军、季军的队伍名称。
2026 华为OD机试真题 7月4日华为OD上机新系统考试真题 100 分题型
比赛安排
-
参赛的队伍总数为
teamNum,teamNum的取值范围是 3≤teamNum≤15; -
比赛采用单循环赛制:
- 任意两支参赛队伍之间至少比赛 1 场,若两队队伍之间不存在比赛记录,说明其中有队伍弃赛;
- 总比赛场次不超过 teamNum×(teamNum−1)/2 场;
-
比赛最终各队伍不允许出现积分和净胜球都完全相同的情况。
计分规则
- 胜者得 3 分,平局各得 1 分,负者得 0 分;
- 每场比赛记录双方的进球数(进球数 ≥0),从而计算净胜球(进球数 - 失球数)。
排名规则
首先按总积分从高到低排序。若积分相同,则按净胜球从高到低排序。
输入描述
第一个参数:为一个整数 teamNum,表示参赛队伍的数量。teamNum 的取值范围是 3≤teamNum≤15,若比赛队伍超过此范围则输入不合法。
第二个参数:为一个二维数组。二维数组的每一行表示一场比赛的结果,格式为: 队伍A名称 队伍A进球数 队伍B进球数 队伍B名称;
输出描述
如果输入合法,则输出一个字符串列表,分别为冠军、亚军、季军的队伍名称; 如果输入不合法,则输出一个空字符串列表。
补充说明
所有不符合题目描述中"比赛安排"、"积分规则"章节约束的输入均视为不合法输入,程序输出按照输入不合法处理。
示例1
输入
3,[["Beijing","2","1","Shanghai"],["Beijing","3","0","Guangzhou"],["Shanghai","1","1","Guangzhou"]]
输出
["Beijing","Shanghai","Guangzhou"]
说明
Beijing:
vs Shanghai: 胜(得 3 分,净胜球 +1)
vs Guangzhou: 胜(得 3 分,净胜球 +3)
总积分:6,总净胜球:4
Shanghai: vs Beijing: 负(得 0 分,净胜球 -1)
vs Guangzhou: 平(得 1 分,净胜球 0)
总积分:1,总净胜球:-1
Guangzhou:
vs Beijing: 负(得 0 分,净胜球 -3)
vs Shanghai: 平(得 1 分,净胜球 0)
总积分:1,总净胜球:-3
所以排名:
- Beijing (6 分, 净胜球 +4) > Shanghai (1 分, 净胜球 -1) > Guangzhou (1 分, 净胜球 -3)
示例2
输入
3,[["Beijing","1","1","Shanghai"],["Guangzhou","1","1","Beijing"],["Shanghai","1","1","Guangzhou"]]
输出
[]
说明
Beijing:
vs Shanghai: 平(得 1 分,净胜球 0)
vs Guangzhou: 平(得 1 分,净胜球 0)
总积分:2,总净胜球:0
Shanghai:
vs Beijing: 平(得 1 分,净胜球 0)
vs Guangzhou: 平(得 1 分,净胜球 0)
总积分:2,总净胜球:0
Guangzhou:
vs Beijing: 平(得 1 分,净胜球 0)
vs Shanghai: 平(得 1 分,净胜球 0)
总积分:2,总净胜球:0
所以排名结果为:Beijing = Shanghai = Guangzhou(三队同积 2 分,净胜球均为 0),并列,不符合题目条件中出现积分和净胜球都完全相同的情况。
解题思路
核心思想
模拟足球联赛积分排名流程:
- 验证输入合法性(队伍数量、比赛场次、是否所有队伍都有比赛)
- 统计每场比赛的积分和净胜球
- 检查是否有无法区分的并列队伍
- 按积分和净胜球排序,取前三名
算法步骤
- 合法性检查:teamNum 范围 [3,15],且去重后的队伍数等于 teamNum
- 初始化积分、进球、失球统计表
- 遍历每场比赛,更新统计数据和已比赛记录
- 验证比赛场次不超过最大场次
- 验证每对队伍都有比赛记录
- 验证没有无法区分的并列队伍
- 排序并返回前三名
复杂度分析
- 时间复杂度:O(N²),主要在检查队伍比赛记录和并列情况
- 空间复杂度:O(N),存储队