题目
有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子,问最后留下的是原来第几号的那位。
这是一个经典的约瑟夫环问题,网上也有很多解答……我理解了题目的意思,但是还是不知道该咋写…
但是网上方法基本上是两种 :
-
模拟约瑟夫环;
基本也是用的循环链表的数据结构。
这题参考了两个b站视频……然后跟着敲了一遍
贴上:约瑟夫环1—用了java 的LinkedList类 、
约瑟夫环2—自己构建一个了循环链表数据结构还可以看一下c语言的实现:c语言实现 ,视频里还有用循环队列实现的- - 改日再写吧得赶紧把剩下的搞完
-
数学方法
以下
第一种
import java.util.*;
public class Problem37 {
public static int Josephus(int n , int m ){
if( n == 0 || m ==0)
return -1;
LinkedList<Integer> list = new LinkedList<> ();
//构建一个链表
for(int i =1; i<=n; i++){
list.add(i); //在链表后面插入
}
//打印链表,可以直接打印,也可以用list.get()一个个获取
System.out.println(list);
System.out.println();
int removeIndex = 0; //removeIndex为需要移除的下标
while(list.size() !=1){
//当list不为空时
removeIndex = (removeIndex + m -1) % list.size()