题目描述
题意解析
n个人围在一起,进行多轮传球游戏,当前球的持有者顺时针将球顺时针传到距离自己 当前轮数 * k(k为题目中给定)的人手中,当有人拿到球两次时,游戏结束。问没有拿到过球的人的编号,按照升序输出。
思路分析
开始感觉和约瑟夫环问题类似,以为可以用数学解法,后来发现直接进行简单的模拟即可。在相加取模的时候,需要注意边界问题,否则会出现问题。
代码
class Solution {
public int[] circularGameLosers(int n, int k) {
int flag[] = new int[n];
ArrayList<Integer> list = new ArrayList<>();
int cnt = 1;
Arrays.fill(flag, 0);
for(int i = 0; i < n;){
flag[i] ++;
if(flag[i] == 2) break;
i = (i + cnt * k) % n;
cnt ++;
}
for(int i = 0; i < n; i ++){
if(flag[i] == 0)
list.add(i);
}
int lossNum = list.size();
int ans[] = new int[lossNum];
for(int i = 0; i < lossNum; i++)
ans[i] = list.get(i) + 1;
return ans;
}
}