【每日一题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 )

目录
相关文章
|
9月前
|
机器人
【每日一题Day270】LC874模拟行走机器人 | 哈希表+模拟
【每日一题Day270】LC874模拟行走机器人 | 哈希表+模拟
56 0
|
9月前
【每日一题Day283】LC822翻转卡片游戏 | 哈希表
【每日一题Day283】LC822翻转卡片游戏 | 哈希表
41 0
【期末不挂科-单片机考前速过系列P6】(第六章:10题速过定时计数器的结构和工作方式例题)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P6】(第六章:10题速过定时计数器的结构和工作方式例题)经典例题盘点(带图解析)
|
9月前
【每日一题Day308】LC57插入区间 | 模拟
【每日一题Day308】LC57插入区间 | 模拟
54 0
|
9月前
【每日一题Day326】LC1222可以攻击国王的皇后 | 哈希表+模拟
【每日一题Day326】LC1222可以攻击国王的皇后 | 哈希表+模拟
52 0
|
9月前
【每日一题Day304】LC1267统计参与通信的服务器 | 哈希表
【每日一题Day304】LC1267统计参与通信的服务器 | 哈希表
49 0
|
9月前
【每日一题Day124】LC2347最好的扑克手牌 | 哈希表
【每日一题Day124】LC2347最好的扑克手牌 | 哈希表
52 0
刘金玉的零基础VB教程072期:贪吃蛇游戏开发第八节 总结 补充从尾部开始变长
刘金玉的零基础VB教程072期:贪吃蛇游戏开发第八节 总结 补充从尾部开始变长
107 0
【每日一题Day103】LC1669合并两个链表 | 模拟
思路:遍历链表找到list1中的第a−1个节点和第b+1个节点,然后将第a−1个节点指向list2链表的初始节点,list2链表的尾节点指向list1中的第b+1个节点
99 0
【每日一题Day103】LC1669合并两个链表 | 模拟
|
存储
【每日一题Day35】LC1742盒子中小球的最大数量 | 哈希表 找规律
给你两个整数 lowLimit 和 highLimit ,返回放有最多小球的盒子中的小球数量*。*如果有多个盒子都满足放有最多小球,只需返回其中任一盒子的小球数量。
115 0
【每日一题Day35】LC1742盒子中小球的最大数量 | 哈希表 找规律