leetcode每日一题_2682.找出转圈游戏输家

2682.找出转圈游戏输家
题目:
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 作为答案。

示例 1:

输入:n = 5, k = 2 输出:[4,5] 解释:以下为游戏进行情况: 1)第 1 个朋友接球,第 1 个朋友将球传给距离他顺时针方向 2 步的玩家 —— 第 3 个朋友。 2)第 3 个朋友将球传给距离他顺时针方向 4 步的玩家 —— 第 2 个朋友。 3)第 2 个朋友将球传给距离他顺时针方向 6 步的玩家 —— 第 3 个朋友。 4)第 3 个朋友接到两次球,游戏结束。

示例 2:

输入:n = 4, k = 4 输出:[2,3,4] 解释:以下为游戏进行情况: 1)第 1 个朋友接球,第 1 个朋友将球传给距离他顺时针方向 4 步的玩家 —— 第 1 个朋友。 2)第 1 个朋友接到两次球,游戏结束。

提示:
● 1 <= k <= n <= 50

时间最短

/**
 * @param {number} n
 * @param {number} k
 * @return {number[]}
 */
var circularGameLosers = function(n, k) {
    //实现声明一个长度为n的数组,并全部填充为false
    //用来表示,所有朋友都没有接到球,当有一个朋友接到球时,赋值为true
    //但是当这个朋友本身就是true时,结束游戏,并将所有值为false的朋友下标输出
    let allF = new Array(n).fill(false);
    //将当前第一个朋友下标定位0,一共走了i+=k步
    //当allF[j]个朋友本身是true时,终止循环
    for (let i = k, j = 0; !allF[j]; i += k) {
        //循环到allF[j]个朋友,给他赋值true,下次再循环到他,那么游戏结束
        allF[j] = true;
        //现在循环到第j个朋友加上k(顺时针多少步),再取余n,除n是获得走了多少圈
        j = (j + i) % n;
    }
    //声明一个数组,用于接收allF内值为false的数组元素
    let ans = [];
    for (let i = 0; i < n; i++) {
        if (!allF[i]) {
            //加一是因为我们是从第零个开始
            ans.push(i + 1);
        }
    }
    return ans;
}

内存最少

/**
 * @param {number} n
 * @param {number} k
 * @return {number[]}
 */
var circularGameLosers = function(n, k) {
    // 声明一个set对象
    //Set对象是值的集合,你可以按照插入的顺序迭代它的元素。
    //Set 中的元素只会出现一次,即 Set 中的元素是唯一的。
    //也就是说,可以将接到球的小朋友编号存入set
    //因为set值唯一,可以使用set.gas()判断当前小朋友到底接没接到球,如果接到了,那么代表游戏结束
    //使用循环遍历,判断set中没有的下标,然后输出
    let set = new Set();
    let start = 0;
    let i = 1;
    while (!set.has(start)) {
        set.add(start);
        start += i * k;
        start %= n;
        i += 1;
    }
    let res = [];
    for (let i = 0; i < n; i++) {
        if (!set.has(i)) res.push(i + 1)
    }
    return res;
}

你可能感兴趣的:(leetcode每日一题,leetcode,游戏,算法,转圈输家,找出转圈游戏输家,2682)