游戏队友搜索问题
这道题要求我们根据玩家与比赛的历史记录,找到与指定玩家至少一起参与过两局比赛的所有玩家,即“队友”。通过输入的比赛记录,我们需要分析哪些玩家在同一局比赛中出现过,并且至少一起参与过两局。
问题描述
在一款多人游戏中,每局比赛需要多个玩家参与。如果发现两名玩家至少一起玩过两局比赛,则可以认为这两名玩家互为队友。现有一份玩家和比赛历史记录的表格,目标是帮助指定玩家找到所有符合条件的队友。
例如,已知以下比赛历史记录:
| 玩家ID | 游戏ID |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 4 |
| 3 | 2 |
| 4 | 1 |
| 4 | 2 |
| 5 | 2 |
| 5 | 3 |
测试样例
样例1:
输入:
id = 1, num = 10, array = [[1,1], [1,2], [1,3], [2,1], [2,4], [3,2], [4,1], [4,2], [5,2], [5,3]]
输出:
[4, 5]
样例2:
输入:
id = 2, num = 6, array = [[2,1], [2,3], [1,1], [1,2], [3,1], [4,3]]
输出:
[]
样例3:
输入:
id = 3, num = 8, array = [[3,1], [3,2], [3,3], [4,1], [5,2], [6,3], [7,1], [7,2]]
输出:
[7]
题目等级
难度:基础。属于比较常见的遍历题
解题思路
-
记录比赛历史:首先,我们需要遍历所有比赛记录,创建一个字典
game_to_players,用来存储每场比赛对应的所有玩家。 -
查找指定玩家的比赛:然后,找到指定玩家参与的所有比赛。通过遍历比赛记录,我们可以提取出该玩家参与的所有游戏ID。
-
统计与指定玩家的共同参赛玩家:对于每一场指定玩家参与的比赛,找出参与该比赛的其他玩家,并记录这些玩家与指定玩家一起参加比赛的次数。
-
筛选符合条件的队友:最后,筛选出那些至少与指定玩家一起参加过两次比赛的玩家,这些玩家就是符合条件的队友。
代码实现
def solution(id, num, array):
from collections import defaultdict
# 创建一个字典来存储每个比赛中参与的玩家
game_to_players = defaultdict(set)
# 填充字典
for player_id, game_id in array:
game_to_players[game_id].add(player_id)
# 找到指定玩家参与的所有比赛
player_games = set()
for player_id, game_id in array:
if player_id == id:
player_games.add(game_id)
# 记录与指定玩家一起参与的其他玩家
teammate_count = defaultdict(int)
for game_id in player_games:
for player in game_to_players[game_id]:
if player != id:
teammate_count[player] += 1
# 找出那些至少一起参与两次比赛的玩家
result = [player for player, count in teammate_count.items() if count >= 2]
return sorted(result)
if __name__ == "__main__":
# 测试用例
print(
solution(
1,
10,
[
[1, 1],
[1, 2],
[1, 3],
[2, 1],
[2, 4],
[3, 2],
[4, 1],
[4, 2],
[5, 2],
[5, 3],
],
)
== [4, 5]
)
代码解释
-
字典
game_to_players:- 用于存储每个比赛(通过
game_id标识)参与的所有玩家(通过player_id标识)。 - 遍历比赛记录,将每个比赛ID与其对应的玩家列表建立映射。
- 用于存储每个比赛(通过
-
集合
player_games:- 用于存储指定玩家(通过
id标识)参与的所有比赛的ID。 - 通过遍历历史记录中的比赛ID,提取出指定玩家的所有比赛。
- 用于存储指定玩家(通过
-
字典
teammate_count:- 用来记录与指定玩家共同参与过的每个玩家的比赛次数。
- 如果某个玩家与指定玩家在某场比赛中共同参与,则计数器加1。
-
筛选队友:
- 最后,通过筛选出计数大于等于2的玩家,即为符合条件的队友,并按升序排列返回结果。
测试样例分析
- 样例1:玩家1的队友是玩家4和玩家5,因为他们至少一起参与了两局比赛。
- 样例2:玩家2没有与其他玩家至少一起参加过两次比赛,因此返回空列表。
- 样例3:玩家3的队友是玩家7,因为他们一起参与了两局比赛。
总结
通过这个题目,我加深了对字典和集合的使用,尤其是在处理关联关系时,这两种数据结构非常高效。这个问题考察了如何快速统计和筛选符合条件的玩家,并使用简单的数据结构完成了任务,时间复杂度相对较低,适合处理较大规模的输入数据。