11.10刷题——游戏队友搜索(简单)| 豆包MarsCode AI刷题

63 阅读4分钟

这道题目在入营刷题阶段就尝试过,但没有解答成功,这次在marscode的帮助下尝试解答成功,故在这里分享解题及marscode的使用帮助。

理解题目

这道题目中,我们需要帮助某个指定玩家找到所有符合条件的队友。

条件是两名玩家至少一起玩过两局比赛。

输入包括玩家ID、比赛局次的数量以及每场比赛的玩家记录。

输出是所有符合条件的队友的ID列表。

解题难点和解决

  1. 数据结构的选择:选择个合适的数据结构来存储每个玩家参与的游戏记录,以便快速查找和比较。

    1. 第一次出错就是在这里,第一次的逻辑是:对于每个玩家,如果他们与指定玩家共同参加的比赛数量大于或等于2,则增加他们在teammates字典中的计数。但是,这个计数并没有重置,这意味着即使某些玩家与指定玩家共同参加的比赛少于两局,他们的计数也可能因为之前的迭代而增加,导致最终的结果不准确。
    2. 第二次我单独使用matscode提供了思路,选择构建一个字典 player_games,其中键是玩家ID,值是一个集合,包含该玩家参与的所有游戏ID。这样可以方便后续查找某个玩家参与的所有游戏。
  2. 共同比赛的计算:计算两个玩家之间的共同比赛次数。

解答思路

  1. 数据结构的选择:使用字典(player_games)来存储每个玩家参与的游戏记录,其中键是玩家ID,值是一个集合(set),存储该玩家参与的所有游戏ID。这里,集合的好处是可以快速添加、删除和查找元素,同时自动去除重复项。
  2. 记录目标玩家的比赛:遍历输入的数组,将目标玩家参与的游戏ID添加到target_games集合中。
  3. 计算共同比赛次数:对于每个玩家,计算他们与目标玩家的共同游戏ID数量,即两个集合的交集的大小。
  4. 筛选队友:如果一个玩家与目标玩家的共同游戏数大于等于2,则认为他们是队友。
  5. 排序输出:将所有找到的队友ID放入一个列表中,并对其进行排序,以满足输出格式的要求。

解决方法

以下是详细的步骤和代码实现:

  1. 初始化数据结构

    1. 创建个空字典player_games,用于存储每个玩家参与的游戏ID集合。
    2. 创建空集合target_games,用于存储目标玩家参与的游戏ID。
  2. 构建玩家游戏记录

    1. 遍历输入的二维数组,对于每个元素[player_id, game_id]

      • 如果player_id不在player_games中,添加进去,并初始化为空集合。
      • game_id添加到对应player_id的集合中。
      • 如果player_id是目标玩家的ID,也将game_id添加到target_games中。
  3. 计算共同比赛次数并筛选队友

    1. 创建一个空列表teammates,用于存储找到的队友ID。

    2. 遍历player_games中的每个玩家(除了目标玩家自己):

      • 计算目标玩家与当前玩家的共同游戏数,即target_games与当前玩家游戏集合的交集的大小。
      • 如果共同游戏数大于等于2,则将当前玩家的ID添加到teammates列表中。
  4. 排序输出

    1. 使用Python的内置函数sorted()teammates列表进行排序。
    2. 返回排序后的列表。

最终解答

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)  # 返回排序后的队友列表