题目描述
现有n个人围坐一圈,顺时针给大家编号,第一个人编号为1,然后顺时针开始报数。第一轮依次报1,2,1,2…没报1的人出局。接着第二轮再从上一轮最后一个报数的人开始依次报1,2,3,1,2,3…没报1的人都出局。以此类推直到剩下以后一个人。现给定一个int n,要求返回最后一个人的编号。
public class Joseph {
public int getResult(int n) {
if( n < 1){
return -1;
}
LinkedList<Integer> list = new LinkedList<>();
int i = 0 ;
int cur = 0;
int round = 2;
for(i = 1; i <= n ; i++){
list.add(i);
}
while(list.size() > 1){
i = 0;
while(list.size() > 1 && i < list.size()){
cur = (cur+1) % round;
if(cur != 1){
list.remove(i);
}else{
i++;
}
}
round++;
cur = 0;//第一轮结束后,要重新报数;
if(list.size() > 1){
int last = list.removeLast(); //尾巴删掉然后加到头里面
list.addFirst(last);
}
}
return list.pop();
}
}