根据题意可以知道总共有 n 个位置,由于起始编号为 1,第 i 个朋友的位置顺时针移动 1 步会到达第 (i + 1) \bmod n + 1 个朋友的位置。
游戏规则如下: 从第 1 个位置开始传球。
接着,第 1 个朋友将球传给距离他顺时针方向 k 步的朋友。
然后,接球的朋友应该把球传给距离他顺时针方向 2k 步的朋友。
接着,接球的朋友应该把球传给距离他顺时针方向 3k 步的朋友,以此类推。
换句话说,在第 i 轮中持有球的那位朋友将球传递给距离他顺时针方向 i \times k 步的朋友,假设在第 i 轮中持有球的朋友位置为 x,则第 i + 1 轮持有球的朋友位置为 (x + i \times k) \bmod n + 1。当某个位置第 2 次接到球时,游戏结束,在整场游戏中没有接到过球的朋友是输家。
我们根据题意直接模拟即可,为了方便计算,设第 1 个小朋友的起始位置为 0,则从 0 开始进行传递,同时用 visit 来标记每个位置是否被访问过,假设当前的位置为 j,则第 i 次传递后球的位置处于 (j + i \times k) \bmod n,此时将所有访问过的位置标记即可,直到当前位置 j 已经被遍历过则直接结束,然后依次遍历找到未被访问的位置返回即可。
代码
[sol1-C++]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution { public: vector<int> circularGameLosers(int n, int k){ vector<bool> visit(n, false); for (int i = k, j = 0; !visit[j]; i += k) { visit[j] = true; j = (j + i) % n; } vector<int> ans; for (int i = 0; i < n; i++) { if (!visit[i]) { ans.emplace_back(i + 1); } } return ans; } };
classSolution { publicint[] circularGameLosers(int n, int k) { boolean[] visit = newboolean[n]; for (inti= k, j = 0; !visit[j]; i += k) { visit[j] = true; j = (j + i) % n; } List<Integer> list = newArrayList<Integer>(); for (inti=0; i < n; i++) { if (!visit[i]) { list.add(i + 1); } } int[] ans = newint[list.size()]; for (inti=0; i < list.size(); i++) { ans[i] = list.get(i); } return ans; } }
[sol1-Python3]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution: defcircularGameLosers(self, n: int, k: int) -> List[int]: visit = [False] * n i = k j = 0 whilenot visit[j]: visit[j] = True j = (j + i) % n i += k ans = [] for i inrange(n): ifnot visit[i]: ans.append(i + 1) return ans
[sol1-Go]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
funccircularGameLosers(n, k int) []int { visit := make([]bool, n) j := 0 for i := k; !visit[j]; i += k { visit[j] = true; j = (j + i) % n; } ans := make([]int, 0, n) for i := 0; i < n; i++ { if !visit[i] { ans = append(ans, i+1) } } return ans }
[sol1-JavaScript]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
var circularGameLosers = function(n, k) { let visit = newArray(n).fill(false); for (let i = k, j = 0; !visit[j]; i += k) { visit[j] = true; j = (j + i) % n; } let ans = []; for (let i = 0; i < n; i++) { if (!visit[i]) { ans.push(i + 1); } } return ans; };