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

144 阅读4分钟

游戏队友搜索问题

这道题要求我们根据玩家与比赛的历史记录,找到与指定玩家至少一起参与过两局比赛的所有玩家,即“队友”。通过输入的比赛记录,我们需要分析哪些玩家在同一局比赛中出现过,并且至少一起参与过两局。

问题描述

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

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

玩家ID游戏ID
11
12
13
21
24
32
41
42
52
53

测试样例

样例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. 记录比赛历史:首先,我们需要遍历所有比赛记录,创建一个字典 game_to_players,用来存储每场比赛对应的所有玩家。

  2. 查找指定玩家的比赛:然后,找到指定玩家参与的所有比赛。通过遍历比赛记录,我们可以提取出该玩家参与的所有游戏ID。

  3. 统计与指定玩家的共同参赛玩家:对于每一场指定玩家参与的比赛,找出参与该比赛的其他玩家,并记录这些玩家与指定玩家一起参加比赛的次数。

  4. 筛选符合条件的队友:最后,筛选出那些至少与指定玩家一起参加过两次比赛的玩家,这些玩家就是符合条件的队友。

代码实现

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

代码解释

  1. 字典 game_to_players

    • 用于存储每个比赛(通过 game_id 标识)参与的所有玩家(通过 player_id 标识)。
    • 遍历比赛记录,将每个比赛ID与其对应的玩家列表建立映射。
  2. 集合 player_games

    • 用于存储指定玩家(通过 id 标识)参与的所有比赛的ID。
    • 通过遍历历史记录中的比赛ID,提取出指定玩家的所有比赛。
  3. 字典 teammate_count

    • 用来记录与指定玩家共同参与过的每个玩家的比赛次数。
    • 如果某个玩家与指定玩家在某场比赛中共同参与,则计数器加1。
  4. 筛选队友

    • 最后,通过筛选出计数大于等于2的玩家,即为符合条件的队友,并按升序排列返回结果。

测试样例分析

  • 样例1:玩家1的队友是玩家4和玩家5,因为他们至少一起参与了两局比赛。
  • 样例2:玩家2没有与其他玩家至少一起参加过两次比赛,因此返回空列表。
  • 样例3:玩家3的队友是玩家7,因为他们一起参与了两局比赛。

总结

通过这个题目,我加深了对字典和集合的使用,尤其是在处理关联关系时,这两种数据结构非常高效。这个问题考察了如何快速统计和筛选符合条件的玩家,并使用简单的数据结构完成了任务,时间复杂度相对较低,适合处理较大规模的输入数据。