问题描述

在一款多人游戏中,每局比赛需要多个玩家参与。如果发现两名玩家至少一起玩过两局比赛,则可以认为这两名玩家互为队友。现在你有一份玩家(通过玩家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;
}

}

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐