这道题目在入营刷题阶段就尝试过,但没有解答成功,这次在marscode的帮助下尝试解答成功,故在这里分享解题及marscode的使用帮助。
理解题目
这道题目中,我们需要帮助某个指定玩家找到所有符合条件的队友。
条件是两名玩家至少一起玩过两局比赛。
输入包括玩家ID、比赛局次的数量以及每场比赛的玩家记录。
输出是所有符合条件的队友的ID列表。
解题难点和解决
-
数据结构的选择:选择个合适的数据结构来存储每个玩家参与的游戏记录,以便快速查找和比较。
- 第一次出错就是在这里,第一次的逻辑是:对于每个玩家,如果他们与指定玩家共同参加的比赛数量大于或等于2,则增加他们在
teammates字典中的计数。但是,这个计数并没有重置,这意味着即使某些玩家与指定玩家共同参加的比赛少于两局,他们的计数也可能因为之前的迭代而增加,导致最终的结果不准确。 - 第二次我单独使用matscode提供了思路,选择构建一个字典
player_games,其中键是玩家ID,值是一个集合,包含该玩家参与的所有游戏ID。这样可以方便后续查找某个玩家参与的所有游戏。
- 第一次出错就是在这里,第一次的逻辑是:对于每个玩家,如果他们与指定玩家共同参加的比赛数量大于或等于2,则增加他们在
-
共同比赛的计算:计算两个玩家之间的共同比赛次数。
解答思路
- 数据结构的选择:使用字典(
player_games)来存储每个玩家参与的游戏记录,其中键是玩家ID,值是一个集合(set),存储该玩家参与的所有游戏ID。这里,集合的好处是可以快速添加、删除和查找元素,同时自动去除重复项。 - 记录目标玩家的比赛:遍历输入的数组,将目标玩家参与的游戏ID添加到
target_games集合中。 - 计算共同比赛次数:对于每个玩家,计算他们与目标玩家的共同游戏ID数量,即两个集合的交集的大小。
- 筛选队友:如果一个玩家与目标玩家的共同游戏数大于等于2,则认为他们是队友。
- 排序输出:将所有找到的队友ID放入一个列表中,并对其进行排序,以满足输出格式的要求。
解决方法
以下是详细的步骤和代码实现:
-
初始化数据结构:
- 创建个空字典
player_games,用于存储每个玩家参与的游戏ID集合。 - 创建空集合
target_games,用于存储目标玩家参与的游戏ID。
- 创建个空字典
-
构建玩家游戏记录:
-
遍历输入的二维数组,对于每个元素
[player_id, game_id]:- 如果
player_id不在player_games中,添加进去,并初始化为空集合。 - 将
game_id添加到对应player_id的集合中。 - 如果
player_id是目标玩家的ID,也将game_id添加到target_games中。
- 如果
-
-
计算共同比赛次数并筛选队友:
-
创建一个空列表
teammates,用于存储找到的队友ID。 -
遍历
player_games中的每个玩家(除了目标玩家自己):- 计算目标玩家与当前玩家的共同游戏数,即
target_games与当前玩家游戏集合的交集的大小。 - 如果共同游戏数大于等于2,则将当前玩家的ID添加到
teammates列表中。
- 计算目标玩家与当前玩家的共同游戏数,即
-
-
排序输出:
- 使用Python的内置函数
sorted()对teammates列表进行排序。 - 返回排序后的列表。
- 使用Python的内置函数
最终解答
def solution(id, num, array):
# 创建玩家游戏记录字典
player_games = {}
# 记录目标玩家参与的游戏
target_games = set()
# 构建玩家游戏记录
for player, game in array:
if player not in player_games:
player_games[player] = set()
player_games[player].add(game)
# 记录目标玩家的游戏
if player == id:
target_games.add(game)
teammates = []
# 检查每个玩家与目标玩家的共同游戏数
for player in player_games:
if player != id: # 排除目标玩家自己
# 计算共同游戏数
common_games = len(target_games.intersection(player_games[player]))
if common_games >= 2: # 如果共同游戏数大于等于2
teammates.append(player)
return sorted(teammates) # 返回排序后的队友列表