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
這個題目其實直接模擬游戲過程即可。主要可能每一次跳的 k * i需要關注下,并且還需要進行取余操作。
思路:
記錄起始位置start,每一次的跳躍步長 step * k,其中step是第幾次跳。然后記錄遍歷過的玩家數量cnt,用于后面答案數組的初始化長度 n - cnt,vis標記為是否遍歷過的玩家。
ac code:
class Solution {public int[] circularGameLosers(int n, int k) {boolean[] vis = new boolean[n+1];int start = 1;int step = 0;int cnt = 0;while (!vis[(start + step * k) % n]) {vis[(start + step * k) % n] = true;start = start + step * k;step += 1;cnt += 1;}int[] ans = new int[n - cnt];int index = 0;for (int i=1;i<=n;i++) {if (!vis[i % n]) {ans[index++] = i;}}return ans;}
}