青训营 X 豆包MarsCode 技术训练营--游戏队友搜索
在一款多人游戏中,每局比赛需要多个玩家参与。如果发现两名玩家至少一起玩过两局比赛,则可以认为这两名玩家互为队友。现在你有一份玩家(通过玩家ID标识)和比赛局次(通过比赛ID标识)的历史记录表,目标是帮助某位指定玩家找到所有符合条件的队友。例如,已知以下比赛历史记录:| 玩家ID | 游戏ID |测试样例。
问题描述
在一款多人游戏中,每局比赛需要多个玩家参与。如果发现两名玩家至少一起玩过两局比赛,则可以认为这两名玩家互为队友。现在你有一份玩家(通过玩家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]
玩家1参与了游戏1、2和3。
在游戏1中,玩家1与玩家2和玩家4共同参与。但玩家2只出现了一次,所以不计入队友。
在游戏2中,玩家1与玩家3、玩家4和玩家5共同参与。玩家3只出现了一次,而玩家4出现了第二次(在游戏1中已经出现过),玩家5则是第一次出现。
在游戏3中,玩家1与玩家5共同参与。此时玩家5已经是第二次与玩家1共同参与比赛了。
因此,玩家4和玩家5都至少与玩家1共同参与了两局比赛,所以他们是玩家1的队友。
样例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]
玩家3参与了游戏1、2和3。
在游戏1中,玩家3与玩家4和玩家7共同参与。
在游戏2中,玩家3与玩家5和玩家7共同参与。这时玩家7已经是第二次与玩家3共同参与比赛了。
在游戏3中,玩家3与玩家6共同参与。但这只是第一次共同参与。
只有玩家7与玩家3共同参与了两局比赛,所以玩家7是玩家3的唯一队友。
解决方案步骤
数据结构选择:
使用一个HashMap<Integer, Integer>来存储每个潜在队友与指定玩家共玩过的游戏次数。键是队友的玩家ID,值是他们共玩游戏的次数。
遍历游戏记录:
遍历整个二维数组array。
对于每一个记录,检查它是否属于指定玩家。如果是,则继续处理同一局游戏中的其他参与者。
更新队友计数:
如果当前记录是关于指定玩家的,那么在同一个游戏ID下的其他所有玩家都是潜在队友。
更新这些玩家在HashMap中的计数。如果该玩家之前没有出现过,则初始化为1;否则,在原有基础上加1。
筛选符合条件的队友:
在遍历结束后,我们有了每个玩家与指定玩家共玩游戏的次数。
筛选出那些共玩游戏次数大于等于2的玩家,并将它们添加到结果列表中。
返回结果:
将结果列表转换成数组形式并排序后返回。
代码实现思路
初始化:创建一个空的HashMap用于存储队友和他们的共玩游戏次数。
遍历记录:对于每个游戏记录,如果记录中的玩家ID与指定玩家ID相同,则查找同一游戏ID下其他所有玩家,并更新他们在HashMap中的计数。
收集结果:遍历HashMap,找到所有共玩游戏次数大于等于2的玩家,并将它们添加到结果列表中。
输出结果:将结果列表转换成数组,进行排序(如果需要)后返回。
注意事项
在遍历过程中,要确保不会重复计算同一局游戏中同一个玩家。
结果可能需要排序,以保证输出的一致性。
处理特殊情况,比如没有任何玩家满足条件时应返回空数组。
import java.util.*;
public class Main {
public static void main(String[] args) {
// 测试用例
System.out.println(Arrays.equals(solution(1, 10, new int[][]{{1, 1}, {1, 2}, {1, 3}, {2, 1}, {2, 4}, {3, 2}, {4, 1}, {4, 2}, {5, 2}, {5, 3}}), new int[]{4, 5}));
System.out.println(Arrays.equals(solution(2, 6, new int[][]{{2, 1}, {2, 3}, {1, 1}, {1, 2}, {3, 1}, {4, 3}}), new int[]{}));
System.out.println(Arrays.equals(solution(3, 8, new int[][]{{3, 1}, {3, 2}, {3, 3}, {4, 1}, {5, 2}, {6, 3}, {7, 1}, {7, 2}}), new int[]{7}));
}
代码
public static int[] solution(int id, int num, int[][] array) {
// 使用HashMap来存储每个玩家与指定玩家共同参与的游戏次数
Map<Integer, Integer> teammateGames = new HashMap<>();
// 遍历游戏记录数组
for (int[] record : array) {
int p_id = record[0];
int g_id = record[1];
// 如果当前记录是关于指定玩家的
if (p_id == id) {
// 检查同一场比赛中的其他玩家
for (int[] otherRecord : array) {
int otherP_id = otherRecord[0];
int otherG_id = otherRecord[1];
// 确保不是同一个玩家,并且是在同一场比赛
if (otherP_id != id && otherG_id == g_id) {
// 更新队友游戏次数
teammateGames.put(otherP_id, teammateGames.getOrDefault(otherP_id, 0) + 1);
}
}
}
}
// 创建结果数组
List<Integer> result = new ArrayList<>();
for (Map.Entry<Integer, Integer> entry : teammateGames.entrySet()) {
if (entry.getValue() >= 2) {
result.add(entry.getKey());
}
}
// 将List转换为数组并排序
int[] teammates = new int[result.size()];
for (int i = 0; i < result.size(); i++) {
teammates[i] = result.get(i);
}
Arrays.sort(teammates);
return teammates;
}
}
更多推荐
所有评论(0)