算法知识视频讲解
题目描述
约瑟夫问题是一个著名的趣题。这里我们稍稍修改一下规则。有n个人站成一列。并从头到尾给他们编号,第一个人编号为1。然后从头开始报数,第一轮依次报1,2,1,2...然后报到2的人出局。接着第二轮再从上一轮最后一个报数的人开始依次报1,2,3,1,2,3...报到2,3的人出局。以此类推直到剩下以后一个人。现在需要求的即是这个人的编号。
public int getResult(int n) {
//首先创建一个数组集合,将所有的元素增加到集合中
LinkedList<integer> result=new LinkedList<>();
int round=2;
int curr=0;
//将元素增加到集合中
for(int i=1;i<=n;i++){
result.add(i);
}
//循环遍历当result的长多大于1
while(result.size()>1){
int i=0;
while(result.size()>1&&i<result.size()){
curr=(curr+1)%round;
if(curr!=1){
result.remove(i);
}
else{
i++;
}
}
round++;
curr=0;
//将尾部元素移除,之后增加到集合首部;
if(result.size()>1){
int last=result.removeLast();
result.addFirst(last);
}
}
return result.pop();
}</integer>