1.问题描述
约瑟夫环问题的基本描述如下:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,要求找到最后一个出列的人或者模拟这个过程。
2.实现代码
public static void yuesefu(int totalNum,int countNum){
//首先将所有的编号加入到集合中
/*
remove每移除一个元素,后面的元素都会向前移动一个位置
list集合中有索引,并且是以0开始
*/
List<Integer> list = new ArrayList<>();
for(int i=1;i<=totalNum;i++){
list.add(i);
}
//从第k个编号开始计数,这里假设从第一个编号开始计数
int k = 0;
while (!list.isEmpty()){
//记录每次被叫到号的索引
k = (k + countNum)%list.size()-1;
//当到达队尾时即k+countNum = list.size();
if (k<0){
//当只剩最后一个元素时,输出
if(list.size() == 1) System.out.println(list.get(0));
list.remove(list.size()-1);
k = 0;
}else{
list.remove(list.get(k));
}
}
}