package com.neusoft.test;
/**
* n个人,从第k个人从1开始报数,报到m的人出列,m的下一个人接着从1开始报数,报到m的人出列...
* 直到队列只剩一个人,求出这个人是n个人中的第几个
*/
import java.util.ArrayList;
import java.util.List;
public class JosephProblem {
public static void main(String[] args) {
System.out.println(josephProblem(41,2,3));
}
private static int josephProblem(int num,int start,int q) {
int count=0;
int j=start-1;
List<Integer> list=new ArrayList<Integer>();
for(int i=0;i<num;i++) {
list.add(i+1);
}
do {
if(list.size()==1) {
// System.out.println(list.get(0));
break;
}
count++;
if(j>=list.size()) {
j=0;
}
if(count%q==0) {
// System.out.println("j="+(j+1));
// System.out.println("淘汰的数字是:"+list.get(j));
list.remove(j);
j--;
}
j++;
} while(true);
return list.get(j);
}
}
思路是除了集合的元素删除这一点外,约瑟夫环问题每一次淘汰数字的过程很像星期几的问题,即每次数到最后一个数,又要从第一个数开始数,类似于每个星期天后都是星期一