【每日一题Day297】LC2682找出转圈游戏输家 | 模拟+哈希表

简介: 【每日一题Day297】LC2682找出转圈游戏输家 | 模拟+哈希表

找出转圈游戏输家【LC2682】

n 个朋友在玩游戏。这些朋友坐成一个圈,按 顺时针方向 从 1 到 n 编号。从第 i 个朋友的位置开始顺时针移动 1 步会到达第 (i + 1) 个朋友的位置(1 <= i < n),而从第 n 个朋友的位置开始顺时针移动 1 步会回到第 1 个朋友的位置。

游戏规则如下:

第 1 个朋友接球。

接着,第 1 个朋友将球传给距离他顺时针方向 k 步的朋友。

然后,接球的朋友应该把球传给距离他顺时针方向 2 * k 步的朋友。

接着,接球的朋友应该把球传给距离他顺时针方向 3 * k 步的朋友,以此类推。

换句话说,在第 i 轮中持有球的那位朋友需要将球传递给距离他顺时针方向 i * k 步的朋友。

当某个朋友第 2 次接到球时,游戏结束。

在整场游戏中没有接到过球的朋友是 输家 。

给你参与游戏的朋友数量 n 和一个整数 k ,请按升序排列返回包含所有输家编号的数组 answer 作为答案。

昨天梦到面试在手撕一道很有意思的算法,还没手撕出来呢,就醒了,醒来题目也忘了,难受

思路:哈希表+模拟

使用哈希表记录每个位置的访问状态,进行模拟直至一个位置被重复访问。模拟过程中记录访问的轮次,剩余人数即为n − i n-in−i,再次遍历哈希表,将未访问过的位置按照从小到大的顺序放入结果中

实现

class Solution {
    public int[] circularGameLosers(int n, int k) {
        boolean[] vis = new boolean[n];
        vis[0] = true;
        int index = 0, i = 1;
        while(true){
            index = (index + i * k) % n;         
            if (vis[index]){
                break;
            }
            i++;
            vis[index] = true;
        }
        int[] res = new int[n - i];
        i = 0;
        for (int j = 0; j < n; j++){
            if (!vis[j]){
                res[i++] = j + 1;
            }
        }
        return res;
    }
}

复杂度

时间复杂度:O ( n )

空间复杂度:O ( n )

目录
相关文章
|
8月前
【每日一题Day199】LC1010总持续时间可被 60 整除的歌曲 | 哈希表
【每日一题Day199】LC1010总持续时间可被 60 整除的歌曲 | 哈希表
50 1
|
8月前
|
机器人
【每日一题Day270】LC874模拟行走机器人 | 哈希表+模拟
【每日一题Day270】LC874模拟行走机器人 | 哈希表+模拟
54 0
|
8月前
【每日一题Day283】LC822翻转卡片游戏 | 哈希表
【每日一题Day283】LC822翻转卡片游戏 | 哈希表
37 0
|
8月前
|
存储
【每日一题Day113】LC1797设计一个验证系统 | 哈希表
【每日一题Day113】LC1797设计一个验证系统 | 哈希表
49 0
|
8月前
【每日一题Day308】LC57插入区间 | 模拟
【每日一题Day308】LC57插入区间 | 模拟
51 0
|
8月前
【每日一题Day124】LC2347最好的扑克手牌 | 哈希表
【每日一题Day124】LC2347最好的扑克手牌 | 哈希表
49 0
|
8月前
【每日一题Day326】LC1222可以攻击国王的皇后 | 哈希表+模拟
【每日一题Day326】LC1222可以攻击国王的皇后 | 哈希表+模拟
49 0
|
8月前
【每日一题Day304】LC1267统计参与通信的服务器 | 哈希表
【每日一题Day304】LC1267统计参与通信的服务器 | 哈希表
47 0
|
Java
随机点名系统
随机点名系统
135 0
【每日一题Day103】LC1669合并两个链表 | 模拟
思路:遍历链表找到list1中的第a−1个节点和第b+1个节点,然后将第a−1个节点指向list2链表的初始节点,list2链表的尾节点指向list1中的第b+1个节点
93 0
【每日一题Day103】LC1669合并两个链表 | 模拟