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

117 阅读3分钟

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

游戏队友搜索 - MarsCode

暴力解决。另外测试样例有坑,array数组是乱序的,并且输出结果要排序后输出,这些题干都没有说

摘要

本文介绍了如何在一款多人游戏中,通过玩家比赛的历史记录找到所有与指定玩家一起参加过至少两次比赛的队友。通过遍历比赛记录和哈希表记录玩家的参赛次数,筛选出符合条件的玩家ID。文中包含Python和Go的代码实现,算法复杂度为 O(nlogn)O(n \log n)

问题描述

在给定的比赛历史记录中,若两名玩家至少一起参与过两局比赛,则可以认为他们互为队友。目标是找到指定玩家的所有符合条件的队友并返回排序结果。

示例

  • 输入: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]

  • 输入:id = 2, num = 6, array = [[2,1], [2,3], [1,1], [3,1], [4,3]] 输出:[]

  • 输入:id = 3, num = 8, array = [[3,1], [3,2], [3,3], [4,1], [5,2], [6,3], [7,1], [7,2]] 输出:[7]

原理分析

1. 遍历比赛历史记录

通过遍历比赛记录,找出指定玩家参加过的所有游戏ID。

2. 记录其他玩家的比赛次数

对于每个比赛ID,记录其他玩家在这些游戏ID中与指定玩家一起参赛的次数。若一个玩家在指定玩家参与的比赛中出现至少两次,则将其标记为符合条件的队友。

3. 排序并返回结果

筛选符合条件的玩家后,对玩家ID进行排序并返回结果。

代码实现

Python代码

from typing import List
import collections

def solution(id: int, num: int, array: List[List[int]]) -> List[int]:
    """
    该函数接收一个玩家 ID、游戏总数 num 和一个二维数组 array。
    查找与指定玩家在相同游戏中出现至少两次的其他玩家 ID,并返回排序后的结果。
    """
    ans = []
    cnt_map = set()          # 存储指定玩家的游戏ID集合
    check_map = collections.defaultdict(int)  # 存储其他玩家与指定玩家共享游戏的计数

    # Step 1: 找到指定玩家的所有游戏ID
    for player_id, game_id in array:
        if player_id == id:
            cnt_map.add(game_id)

    # Step 2: 找到与指定玩家在相同游戏中出现至少两次的玩家
    for player_id, game_id in array:
        if player_id == id:
            continue
        if game_id in cnt_map:
            check_map[player_id] += 1
            if check_map[player_id] == 2:  # 只在达到 2 时加入
                ans.append(player_id)

    # Step 3: 排序结果
    ans.sort()
    return ans


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])  # 应输出 True
    print(solution(2, 6, [[2, 1], [2, 3], [1, 1], [3, 1], [4, 3]]) == [])       # 应输出 True
    print(solution(3, 8, [[3, 1], [3, 2], [3, 3], [4, 1], [5, 2], 
                          [6, 3], [7, 1], [7, 2]]) == [7])                      # 应输出 True

Go语言代码

package main

import (
	"fmt"
	"reflect"
	"sort"
)

func solution(id int, num int, array [][]int) []int {
	ans := []int{}
	cntMap := map[int]struct{}{}
	checkMap := map[int]int{}

	// Step 1: 找到指定玩家的所有游戏ID
	for i := 0; i < len(array); i++ {
		if array[i][0] == id {
			cntMap[array[i][1]] = struct{}{}
		}
	}

	// Step 2: 找到与指定玩家在相同游戏中出现至少两次的玩家
	for i := 0; i < len(array); i++ {
		if array[i][0] == id {
			continue
		}
		if _, exists := cntMap[array[i][1]]; exists {
			checkMap[array[i][0]]++
			if checkMap[array[i][0]] == 2 { // 只在达到 2 时加入
				ans = append(ans, array[i][0])
			}
		}
	}

	// Step 3: 排序结果
	sort.Ints(ans)
	return ans
}

func main() {
	// 测试用例
	fmt.Println(reflect.DeepEqual(solution(1, 10, [][]int{{1, 1}, {1, 2}, {1, 3}, {2, 1}, {2, 4}, {3, 2}, {4, 1}, {4, 2}, {5, 2}, {5, 3}}), []int{4, 5}))
	fmt.Println(reflect.DeepEqual(solution(2, 6, [][]int{{2, 1}, {2, 3}, {1, 1}, {3, 1}, {4, 3}}), []int{}))
	fmt.Println(reflect.DeepEqual(solution(3, 8, [][]int{{3, 1}, {3, 2}, {3, 3}, {4, 1}, {5, 2}, {6, 3}, {7, 1}, {7, 2}}), []int{7}))
}