找出转圈游戏的输家
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个位置,我们用一个boolean数组记录该位置是否被访问过
从j=0位置开始,i = k (步长) 每次循环 i + =k , (下一个位置) j = (j+i)%n; 当有人第二次拿到球结束;
代码实现
class Solution {
public int[] circularGameLosers(int n, int k) {
boolean[] visit = new boolean[n];//记录谁拿过球
for(int i = k,j=0;!visit[j];i+=k){//再次拿到球结束
visit[j] = true;
j= (j+i)%n;
}
List<Integer> list = new ArrayList<>();
for(int i=0;i<n;i++ ){
if(!visit[i]){
list.add(i+1);
}
}
int[] ans = new int[list.size()];
for(int i=0;i<list.size();i++){
ans[i]=list.get(i);
}
return ans;
}
}