有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
浙公网安备 33010602011771号