题目描述:有30个人,从第一个人开始依次报数(从队头到队尾,接着从队头开始),数字范围从1到9,报数字9的人出列。假定最后剩下15个人,求这15个人一开始在队列中的位置。
代码:
import java.util.ArrayList;
//30个人,编号0-29,从第一个人开始从1开始数数,将数到9的人移除。要剩下15个人,看剩下的人原先的位置是什么
public class CountTurns {
public static void main(String[] args) {
CountTurns test = new CountTurns();
test.func1(30, 9, 15);
}
/**
* 人数为num,每数到turn,对应的人出列
* @param num
* @param turn
* @param rest 剩下rest个人
*/
private void func1(int num, int turn, int rest) {
//check param
if(num<=0 || turn<=0 || rest<0)
return;
ArrayList<Node> list = new ArrayList<>();
for(int i = 0; i<num; i++) {//10个人
Node node = new Node(i);
list.add(node);
}
int cur = -1;//用来记录数到的数字
int pos = -1;//记录某节点在队列中对应的下标
while(list.size()>rest) {
pos++;
if(pos == list.size()) {
pos = 0;
}
cur++;
if(cur==turn-1) {
list.remove(pos);
pos--;
cur = -1;
}
}
for(int j = 0; j<rest; j++) {
System.out.println(list.get(j).pos);
}
}
}
class Node{
public int pos;
public Node(int pos) {
super();
this.pos = pos;
}
}
结果: