约瑟夫问题II
约瑟夫问题II
题目描述
约瑟夫问题是一个著名的趣题。这里我们稍稍修改一下规则。有n个人站成一列。并从头到尾给他们编号,第一个人编号为1。然后从头开始报数,第一轮依次报1,2,1,2...然后报到2的人出局。接着第二轮再从上一轮最后一个报数的人开始依次报1,2,3,1,2,3...报到2,3的人出局。以此类推直到剩下以后一个人。现在需要求的即是这个人的编号。
给定一个int n,代表游戏的人数。请返回最后一个人的编号
测试样例:
5
返回:5
本题先只给出两个直接做的做法,可能内存会超
第一个是每次都新建一个新链表:
import java.util.*;
public class Joseph {
public static int getResult(int n) {
LinkedList<Integer>list=new LinkedList<Integer>();
for(int i=0;i<n;i++){
list.add(i+1);
}
int loop=2;
LinkedList<Integer>newList=new LinkedList<Integer>();
while(newList.size()!=1){
if(newList.size()!=0){
newList=new LinkedList<Integer>();
}
int curl=0;
Iterator<Integer>iterator=list.iterator();
while(iterator.hasNext()){
if(curl%loop==0){
newList.add(iterator.next());
}else{
iterator.next();
}
curl++;
}
list=newList;
Integer te=list.getLast();
list.removeLast();
list.addFirst(te);
loop++;
}
return newList.get(0);
}
}
第二个是直接在原链表上删除的(注意用迭代器怎么删除):
import java.util.*;
public class Joseph {
public static int getResult(int n) {
LinkedList<Integer>list=new LinkedList<Integer>();
for(int i=0;i<n;i++){
list.add(i+1);
}
int loop=2;
while(list.size()>1){
int curl=0;
Iterator<Integer>iterator=list.iterator();
while(iterator.hasNext()){
if(curl%loop!=0){
iterator.next();
iterator.remove();
}else{
iterator.next();
}
curl++;
}
Integer temp=list.removeLast();
list.addFirst(temp);
loop++;
}
return list.get(0);
}
}
关于迭代器的删除,可以看这篇文章:https://www.cnblogs.com/jiading/p/12540591.html