Josephus环的四种解法(约瑟夫环)基于java详解

 更新时间:2019年09月12日 10:10:12   作者:---dgw博客  
这篇文章主要介绍了Josephus环的四种解法(约瑟夫环)基于java详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

约瑟夫环

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解

引用别人的一个图:直观说明问题

分析:

  • 第一步:从1开始报数为3的时候就删除3号结点
  • 第二步:从4号结点开始报数,当为3的时候删除6号结点;
  • 第三步:从7号结点开始报数,当为3的时候删除1号结点;
  • 第四步:从2号结点开始报数,当为3的时候删除5号结点;
  • 第五步:从7号结点开始报数,当为3的时候删除2号结点;
  • 第六步:从4号元素开始报数,当为3的时候删除8号结点;
  • 第七步:又从4号开始报数,当为3的时候删除4号结点,此时链表中只有一个7号结点,所以最后的结点就是7号结点;

1.模拟解法

public class 模拟 {
  public static void main(String[] args) {
    Scanner in=new Scanner(System.in);

    //总人数
    int n=in.nextInt();
    // 数到m的那个人出列
    int m=in.nextInt();
    // 初始化为0 都没有出去
    int [] arr=new int[n];

    //剩下的人数
    int peopleLeft=n;
    //初始化下标
    int index=0;
    // 下标计算器
    int count=0;
    // >0 出循环为负
    while (peopleLeft>1){
      if(arr[index]==0){
        // count为计步器 不是下标指向
        count++;
        if(count==m){
          arr[index]=1;
          count=0;
          peopleLeft--;
        }
      }
      index++;
      if(index==arr.length){
        index=0;
      }
    }
    for (int i = 0; i < arr.length; i++) {
      if(arr[i]==0){
        System.out.println(i+1);
      }
    }
  }
}

2.递归解法

/**
   * 递归式:
   * f(1)=0; 第一个位置永远为0
   * f(i)=f(i)+m%n;
   */
  public static int yuesefu(int n,int m){
    if(n==1){
      return 0;
    }else {
      return (yuesefu(n-1,m) + m) % n;
    }
  }
  public static void main(String[] args) {
    System.out.println(yuesefu(41,3)+1);
    vailCode(41,3);
  }

  //逆推验证代码
  public static void vailCode(int a,int b){
    System.out.print(b);
    int reslut;
    for (int i = a; i >=2 ; i--) {
       reslut=2;
      for (int j = i; j <=a ; j++) {
        reslut=(reslut+b)%j;
      }
      System.out.printf("->%d",reslut+1);
    }
  }

3.循环链表解法

public class CircularLinkedList {
  public static void main(String[] args) {
    /**
     * 节点类
     */
    class Node{
      private int data=1;
      private Node next;
      Node(){
        next=null;
      }
    }

    Node head,temp;
    head=new Node();
    head.data=1;

    int a=41;
    int b=3;
    // 临时节点
    temp=head;
    for (int i = 0; i < a; i++) {
      Node new_node=new Node();
      new_node.data=i+1;
      temp.next=new_node;
      temp=new_node;
    }
    temp.next=head.next;
    while (head.next!=head){
      for (int i = 0; i < b-1; i++) {
        head=head.next;
      }
      System.out.print("->"+(head.data+1));
      head.next=head.next.next;
    }
    System.out.println(head.data);
  }
}

4.Collection解法

public static void main(String[] args) {
    int a=41;
    int b=3;
    LinkedList<Integer> list = new LinkedList<>();
    for (int i = 0; i < a; i++) {
      list.add(i+1);
    }
    while (list.size()>1){
      for (int i = 0; i < b-1; i++) {
        list.add(list.remove());
      }
      System.out.print("->"+list.getFirst());
      list.remove();//remve head
    }
    System.out.println(list.getFirst());
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • springboot2.6.7集成springfox3.0.0的示例代码

    springboot2.6.7集成springfox3.0.0的示例代码

    这篇文章主要介绍了springboot2.6.7集成springfox3.0.0的示例代码,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • Mybatis 自动映射(使用需谨慎)

    Mybatis 自动映射(使用需谨慎)

    这篇文章主要介绍了Mybatis 自动映射(使用需谨慎),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Java实现自动生成缩略图片

    Java实现自动生成缩略图片

    这篇文章主要为大家详细介绍了Java实现自动生成缩略图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Jmeter参数化获取序列数据实现过程

    Jmeter参数化获取序列数据实现过程

    这篇文章主要介绍了Jmeter参数化获取序列数据实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 使用springboot aop来实现读写分离和事物配置

    使用springboot aop来实现读写分离和事物配置

    这篇文章主要介绍了使用springboot aop来实现读写分离和事物配置,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • 关于Java中ArrayList的源码分析

    关于Java中ArrayList的源码分析

    这篇文章主要从源码角度带大家深入了解一下Java中ArrayList的构造方法和属性等知识,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-05-05
  • Spring解决循环依赖的方法(三级缓存)

    Spring解决循环依赖的方法(三级缓存)

    今天,我们要说的是spring是如何解决循环依赖的。对于一个问题说解决之前,我们首先要先明确形成问题的本因。那么循环依赖,何为循环依赖呢?感兴趣的朋友跟随小编一起看看吧
    2021-11-11
  • IntelliJ IDEA中使用mybatis-generator的示例

    IntelliJ IDEA中使用mybatis-generator的示例

    这篇文章主要介绍了IntelliJ IDEA中使用mybatis-generator,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 浅谈Spring如何解决循环依赖的问题

    浅谈Spring如何解决循环依赖的问题

    这篇文章主要介绍了浅谈Spring如何解决循环依赖的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Java实现画图的详细步骤(完整代码)

    Java实现画图的详细步骤(完整代码)

    今天给大家带来的是关于Java的相关知识,文章围绕着Java实现画图的详细步骤展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06

最新评论