青训营 X 豆包MarsCode AI 刷题 游戏队友搜索

104 阅读3分钟

游戏队友搜索

在一款多人游戏中,每局比赛需要多个玩家参与。如果发现两名玩家至少一起玩过两局比赛,则可以认为这两名玩家互为队友。现在你有一份玩家(通过玩家ID标识)和比赛局次(通过比赛ID标识)的历史记录表,目标是帮助某位指定玩家找到所有符合条件的队友。

测试样例

样例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]

1. 整体目标

给定一个玩家的 id、一个未在示例代码中详细体现用途的 num 参数以及一个二维数组 array(其中每一行记录了玩家的 id 和游戏的 id,表示该玩家参与了某场特定游戏),要找出与指定玩家共同参与过至少两场相同游戏的其他玩家的 id,并以排序后的数组形式返回这些玩家的 id

2. 具体步骤

数据结构选择
  • 使用 HashMap(在 Python 中对应为字典 teammate_games)来存储每个玩家与指定玩家共同参与的游戏次数。键为其他玩家的 id,值为共同参与游戏的次数。这样可以方便地记录和查询每个队友的相关次数信息。
遍历游戏记录数组以确定共同参与游戏的情况
  • 首先,在外层循环中遍历整个 array 数组,获取每条游戏记录中的玩家 id(记为 p_id)和游戏 id(记为 g_id)。
  • 当发现当前记录的玩家 id 与指定的玩家 id 相等时,就进入内层循环。内层循环再次遍历整个 array 数组,去查找在同一场游戏(即 g_id 相同)中的其他玩家(otherP_id 不等于指定玩家 id)。每当找到这样一个符合条件的其他玩家,就更新该玩家在 teammate_games 字典中的游戏次数记录(如果该玩家 id 是第一次出现,就初始化为 1 次;如果已经存在,就加 1)。
筛选符合条件的玩家
  • 遍历完整个 array 数组后,teammate_games 字典中就记录了每个与指定玩家共同参与过游戏的其他玩家以及他们共同参与的次数。
  • 接着创建一个结果列表 result,遍历 teammate_games 字典的每一项。如果某个玩家的共同参与游戏次数大于等于 2,就将该玩家的 id 添加到 result 列表中。
结果处理
  • 最后,将 result 列表转换为数组(在 Python 示例中其实不需要这一步转换,直接返回列表即可,但如果按照严格与原 Java 代码功能一致,就将列表转换为数组,这里是将列表元素逐个复制到新创建的数组 teammates 中),并对数组进行排序(在 Python 中使用 sort 方法),使得最终返回的数组中的玩家 id 是按照从小到大的顺序排列的。这样就得到了与指定玩家共同参与过至少两场相同游戏的其他玩家的 id 数组。