/*
* 编号为1,2,3,...,n的n个人按顺时针方向围坐成一圈,
* 选一个正数m,从1号开始顺时针方向报数,报到m的那个人出列,
* 然后从下一位开始重新报数,还是报到m的那个人出列,
* 请实现一个方法,以n和m为参数打印出所有出列的顺序。
*/
public class PrintQueue {
public static void main(String[] args) {
f(6, 3);
}
private static void f(int n, int m) {
// 1.crate a cycle linked list
if (n <= 0) {
System.out.print("Nobody");
return;
} else if (m <= 0) {
System.out.print("m is invalid");
return;
}
if (n == 1) {
System.out.print(1);
} else {
Person headPerson = new Person(1);
Person person = headPerson;
Person nextPerson = null;
for (int i = 2; i <= n; i++) {
nextPerson = new Person(i);
person.nextPerson = nextPerson;
person = nextPerson;
}
nextPerson.nextPerson = headPerson;
// 2.select a person that it's num is m
Person currentPerson = headPerson;
int num = 1;
while (currentPerson.nextPerson != currentPerson) {
if (++num % m == 0) {
System.out.print(currentPerson.nextPerson.num + " ,");
currentPerson.nextPerson = currentPerson.nextPerson.nextPerson;
currentPerson = currentPerson.nextPerson;
num = 1;
} else {
currentPerson = currentPerson.nextPerson;
}
}
System.out.print(currentPerson.num);
}
}
static class Person {
private int num;
private Person nextPerson;
public Person(int num) {
this.num = num;
}
}
}
n人围圈,依次报数,找出报数为m的人出列,然后下一位开始重新报数,打印出列顺序
最新推荐文章于 2021-12-16 23:36:36 发布