约瑟夫问题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

posted @ 2020-03-21 17:50  别再闹了  阅读(133)  评论(0)    收藏  举报