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;
}