有n个人围成一圈做游戏,编号为1,2...n,让第每个人开始报数,报到第k个数的那个人出队,出队的下一个人继续报数,报到第k个数的人再出队。以此类推,求出最后一个出队的人。

public class Solution{
    public static void main(String[] args){
        josephus(10,7,3);
    }

    public static void josephus(int n,int m,int k){
        if(n<=0||m<=0||k<=0){
            return;
        }
        m=m%n;
        //存放n个人的位置
        int[] array=new int[n];
       //存放踢出的人的位置
        int[] temp=new int[n];
        //从第m个位置开始,相当于第一个位置存放的是第m个人
        for(int i=m;i<=n;i++){
              array[i-m]=i;
        }
        for(int i=1;i<m;i++){
              array[n-m+i]=i;
        }
        //未踢出人的个数
        int s=n;
        int len;
        //踢出人的个数
        int j=0;
        //间隔计数
        int interval=k;
        while(j<n){
             //一次循环后,未踢出人的个数
             len=s;
             //当前循环,未踢出人的个数
             s=0;
             for(int i=0;i<len;i++){
                 if(--interval!=0){
                      array[s++]=array[i]; //不是目标位置的,放进未踢出的数组中
                 }else{
                       temp[j++]=array[i]; //目标位置的,放进踢出的数组中
                       interval=k; //重设间隔计数
                 }
             }
        }
        for(int x:temp){
             System.out.print(x+" ");
        }
    }
}

 

 posted on 2019-04-04 21:08  会飞的金鱼  阅读(92)  评论(0)    收藏  举报