问题描述
在一款多人游戏中,每局比赛需要多个玩家参与。如果发现两名玩家至少一起玩过两局比赛,则可以认为这两名玩家互为队友。现在你有一份玩家(通过玩家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]
对问题的理解
若想找到与指定玩家至少一起玩过两局比赛的所有玩家。就意味着我们需要统计每个玩家与指定玩家一起玩过的比赛次数,然后筛选出那些至少一起玩过两局比赛的玩家,从而得到符合条件的队友。
确定数据结构
- 比赛记录存储:我们可以使用字典来存储比赛记录,其中键是比赛ID,值是参与该比赛的玩家列表。
- 队友计数:我们可以使用另一个字典来记录每个玩家与指定玩家一起玩过的比赛次数。
算法步骤
- 初始化数据结构:创建一个字典来存储每个玩家与指定玩家一起玩过的比赛次数。
- 遍历比赛记录:对于每一场比赛,检查指定玩家是否参与。
- 统计队友:如果指定玩家参与了某场比赛,遍历该比赛中的所有玩家,更新他们与指定玩家一起玩过的比赛次数。
- 筛选队友:遍历队友计数字典,筛选出那些与指定玩家一起玩过至少两局比赛的玩家。
通过上述步骤,我们可以统计每个玩家与指定玩家一起玩过的比赛次数,并筛选出符合条件的队友。
问题解答
def solution(id, num, array):
from collections import defaultdict
# 字典记录每个玩家参与的比赛
player_games = defaultdict(set)
# 填充字典
for player_id, game_id in array:
player_games[player_id].add(game_id)
# 寻找指定玩家的队友
teammate = set() # 用于存放找到的队友
target_games = player_games[id] # 获取目标玩家的比赛ID集合
# 遍历所有玩家,寻找符合条件的队友
for player in player_games:
if player != id:
# 计算目标玩家和当前玩家的共同比赛数量
common_games = target_games.intersection(player_games[player])
if len(common_games) >= 2: # 至少共同参与2场比赛
teammate.add(player)
return sorted(teammate) # 返回队友的有序列表
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]
)
print(solution(2, 6, [[2, 1], [2, 3], [1, 1], [1, 2], [3, 1], [4, 3]]) == [])
print(solution(3, 8, [[3, 1], [3, 2], [3, 3], [4, 1], [5, 2], [6, 3], [7, 1], [7, 2]]) == [7])
此题目属于简单类题目,运用了两个字典来存储相关数据,思路较简单。以对问题的理解展开,选择数据结构,找到合适算法一系列步骤完成。
- 完成代码的感觉
有一种如释重负的轻松,之前在编写过程中遇到的了难题、卡壳的地方,此刻都被攻克,紧绷的神经一下子松弛下来,感觉整个人都轻快了许多。 也是一种对自己能力的肯定,知道自己可以通过代码去创造、去解决实际问题,这种喜悦会激励着自己继续在代码的世界里探索前行呢。
- 如何锻炼解题思路
-
可以多阅读优秀的代码、多写多练。在网上有许多编程练习平台,如力扣等等,在那里你能找到各种编程语言的代码范例。通过仔细研究这些成熟的代码,了解它们是如何构建程序结构、如何处理数据以及如何实现功能的。
-
打好基础,熟悉各类数据结构的思想以及表达、各类算法思想以及描述。
-
对实际问题进行分解。当面对一个需要用代码解决的任务时,把它拆分成一个个小部分,然后逐个击破。
-
尝试模仿他人的思路。在刚接触编程的时候,可以按照已有的代码逻辑,自己动手重新实现一遍相同的功能。
未来会出一篇关于我自己的解题训练的相关文章。
本人编程菜鸟,若有不对之处,请在下方留言。