问题描述:N个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复,直到所有人出圈。(模拟此过程,输出出圈的人的序号)
思路:借助循环链表思想,一维数组模拟即可,计算出每次需要移动到的位置,然后将这个数移除,指针后移继续,直到数组为空。移除的思路:在移动的过程中记录前一个位置,改变pre的指向,即跳过这个数指向下一个树
import java.util.Scanner;
public class ysfCircle {
static Scanner in = new Scanner(System.in);
public static void main(String[] args) {
int n = in.nextInt();
int m = in.nextInt();
int cnt = n;
int pre = n-1;
int cur = 0;
int[] circle = new int[n];
for (int i = 0; i < circle.length; i++) {
circle[i] = (i+1)%n;//建立循环链表
// System.out.println(i+" "+circle[i]);
}
int[] ans = new int[n];
int te = 0;
while(cnt>0) {
int num = m%cnt-1;//要移动到的位置
for (int i = 0; i < (num==-1?cnt-1:num); i++) {
pre = cur;//记录前一个位置
cur = circle[cur];//移动到下一个
}
ans[te++] = cur+1;//记录结果值(索引值从0开始)
cnt--;
circle[pre] = circle[cur];//将这个数移除
cur = circle[cur];// 从下一个数开始
}
for (int i : ans) {
System.out.print(i+" ");
}
System.out.println();
}
}