游戏队友搜索 | 豆包MarsCode AI刷题

147 阅读4分钟

游戏队友搜索(游戏队友搜索 - MarsCode

问题描述

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

例如,已知以下比赛历史记录:

| 玩家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和比赛ID的历史记录表(在这个例子中是一个二维数组array)。
    • 我们知道要查找的指定玩家的ID(id)。
    • 我们知道比赛历史记录的总数(num),但这个信息实际上在解题过程中并不需要,因为我们可以直接遍历数组。
  2. 数据结构选择

    • 为了高效地统计每个玩家与指定玩家共同参与的比赛次数,我们选择使用字典(在Python中称为dict)。
    • 字典的键是其他玩家的ID,值是该玩家与指定玩家共同参与的比赛次数。
  3. 遍历比赛记录

    • 我们遍历比赛历史记录数组中的每一条记录。
    • 对于每一条记录,我们检查玩家ID是否是指定玩家ID。如果不是,我们更新该玩家在字典中的计数。
    • 如果玩家ID不在字典中,我们将其添加到字典中,并将计数初始化为1。
    • 如果玩家ID已经在字典中,我们将其计数加1。
  4. 筛选符合条件的队友

    • 遍历字典中的每个条目(即每个玩家及其计数)。
    • 我们检查计数是否达到或超过2。如果是,则该玩家是符合条件的队友。
    • 我们将符合条件的队友的ID添加到结果列表中。
  5. 返回结果

    • 最后,我们返回包含所有符合条件队友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]]

  • 我们创建一个空字典team_counts = {}

  • 遍历数组,更新字典:

    • [1,1]:不更新(因为玩家ID是1,与指定玩家相同)。
    • [1,2]:不更新。
    • [1,3]:不更新。
    • [2,1]team_counts[2] = 1(因为玩家2与玩家1共同参与了一局比赛)。
    • [2,4]:不更新(因为与指定玩家1无关)。
    • [3,2]team_counts[3] = 1
    • [4,1]team_counts[4] = 1
    • [4,2]team_counts[4] += 1,现在team_counts[4] = 2
    • [5,2]team_counts[5] = 1
    • [5,3]team_counts[5] += 1,现在team_counts[5] = 2
  • 筛选队友:符合条件的玩家是4和5(因为他们与玩家1共同参与了至少两局比赛)。

  • 输出:[4, 5]

通过这种方法,我们可以高效地找到指定玩家的所有符合条件的队友。

def solution(id, num, array):
    # 记录每个玩家参与的比赛ID
    player_games = {}
    
    for player, game in array:
        if player not in player_games:
            player_games[player] = set()
        player_games[player].add(game)
    
    # 找出与指定玩家一起玩过比赛的其他玩家
    teammates = []
    target_games = player_games.get(id, set())
    
    for player, games in player_games.items():
        if player != id:
            # 计算交集,找出共同参与的比赛
            common_games = target_games & games
            if len(common_games) >= 2:
                teammates.append(player)
    teammates.sort()
    return teammates


if __name__ == "__main__":
    # Add your test cases here

    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]
    )

解释

  1. 字典初始化team_counts 字典用于存储每个玩家与指定玩家共同参与的比赛次数。
  2. 遍历比赛记录:对于每一条记录,如果玩家ID不是指定的玩家ID,则更新该玩家在字典中的计数。
  3. 筛选队友:最后,通过列表推导式筛选出共同参与的比赛次数达到或超过两次的玩家ID。

这个算法的时间复杂度是O(n),其中n是比赛历史记录的数量,因为我们只需要遍历一次比赛记录即可。空间复杂度也是O(n),在最坏情况下,字典中可能存储所有其他玩家的计数。