精华内容
下载资源
问答
  • 约瑟夫环Java

    2019-10-06 07:40:19
    标题 约瑟夫环Java写法 如下图用ArrayList和count计数器for循环可以简单的做出约瑟夫环中1-8数字,3的倍数则出局,最后的幸运数字为7. 如上图所示,用ArrayList和计数器可以计算出8个数字中最后剩下的幸运数字 ...

    标题 约瑟夫环Java写法

    如下图用ArrayList和count计数器for循环可以简单的做出约瑟夫环中1-8数字,3的倍数则出局,最后的幸运数字为7.
    如上图所示,用ArrayList和计数器可以计算出8个数字中最后剩下的幸运数字
    如上图所示,用ArrayList和计数器可以计算出8个数字中最后剩下的幸运数字
    运行结果为:7

    运行结果为:7
    方法二:如下图可以输入需要求的约瑟夫环的数量,倍数,打印出结果与按顺序移除的数字.
    在这里插入图片描述
    运行结果如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    菜鸟一枚,第一次写.比较简陋.向大佬学习ing…

    展开全文
  • 约瑟夫环java实现

    2016-04-26 15:19:57
    约瑟夫环java实现
  • 约瑟夫环Java实现

    2020-12-05 20:57:34
    面试中可能经常会遇到约瑟夫环问题,逻辑上很简单,就是看怎么实现了,一般而言,最简单最直观的就是利用链表,然后构建一个循环结构,正好是环,最后计算出结果。 遍历环形链表会是一个...//约瑟夫环java实现 //约瑟

    面试中可能经常会遇到约瑟夫环问题,逻辑上很简单,就是看怎么实现了,一般而言,最简单最直观的就是利用链表,然后构建一个循环结构,正好是环,最后计算出结果。
    遍历环形链表会是一个无限循环,如果链表中的数据逐渐减少,不控制终究会一个不剩,这又不满足我们问题的求解,因此我们需要定义出循环结束的条件,按照约瑟夫环的规则,只剩下一个的时候就结束,在环形链表结构中,那就是结点本身的下一个节点就是它自己。这样就可以结束遍历了。最后打印出剩下的结点,问题解决。

    这里给出Java版本的实现:

    //约瑟夫环java实现
    //约瑟夫环问题的起源来自犹太历史学家约瑟夫和他的朋友以及39其余的犹太人,总共41人为了躲避敌人,藏在一个山洞中,39个犹太人决定宁愿死也不被敌人抓到,于是决定自杀,所有人排成一个圈,由第一个人开始报数,每当数到3,就自杀。这个游戏接着从自杀的位置开始,还是从1数到3。依次类推,约瑟夫将朋友和自己安排在了16和31的位置,最后顺利逃过了自杀这一劫,因为最后就剩他朋友了。

    package com.nowcoder.community.算法;
    
    /**
     * @author 找花插的牛粪
     * @apiNote 约瑟夫环
     */
    
    public class 约瑟夫环 {
        /**
         * 方法入口
         */
        public static void getman(int n){
            //数到3就自杀
            int k=3;
            //构建头结点 @prame=null,和他的引用对象
            Node head = new Node();
            Node cur = head;
            //构建环
            for (int i = 1; i <= n; i++) {
                Node node = new Node(i);
                //头结点的下一个对象
                cur.next=node;
                //头指针后移动
                cur = node;
            }
            //最终收尾相连
            cur.next=head.next;
            //统计开始的时候,刨去头结点,然后从第一个有数据的结点开始报数
            Node begin = head.next;
            //循环退出的条件是最后只剩一个结点,也就是这个结点的下一个结点是它本身
            while(begin.next != begin){
                //开始数数,注意这里只走了K-2步,来分析为什么 1->2->3 ,其实应该走2步,但是for循环再此处走了一步
                for (int i = 1; i < k-1; i++) {
                    begin = begin.next;
                }
                //是因为我们要办链表除掉一个元素 也就相当于
                // 1->2   4   再此处删除了3 然后拼接 4   1->2->4
                //所以我们必须拿到 2这个节点,否则不能实现链表元素的删除,谁让咱用的是单链表呢
                System.out.println(begin.next.data+"号犹太人"+" go die");
                //此时begin为2节点
                begin.next = begin.next.next;
                begin = begin.next;
    
            }
            //最后剩下的一个结点
            System.out.println("最后胜出者为:"+begin.data+"号");
        }
        public static void main(String[] args) {
            //以4个人为例
            getman(4);
            System.out.println("========================");
            //以41个人为例 16胜出
            getman(41);
        }
    
    
    }
    
    /**
     * @author 找花插的牛粪
     * @apiNote  构建链表成员
     */
    class Node{
        int data;
        Node next;
        public Node(){};
        public Node(int data){this.data=data;}
    }
    

    运行程序,打印结果:
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 约瑟夫环java

    千次阅读 2007-04-03 17:40:00
    开始时任意给出一个报数上限值m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,抱m的人出列,将他的密码作为新的m值,从...要求用JAVA设计一个程序模拟此过程,并给出出列人的编号序列。 测试数据:初始报

    /*

    问题描述:设编号为1,2,…,n(n>0)个人按顺时针方向围坐一圈,每人持有一个正整数密码。开始时任意给出一个报数上限值m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,抱m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新自1起顺序报数;如此下去,直到所有人全部出列为止。要求用JAVA设计一个程序模拟此过程,并给出出列人的编号序列。

    测试数据

    初始报数上限值m = 20

    n = 7,七个人的密码依次为3,1,7,2,4,8,4

    */

    import javax.swing.*;

    public class Yuesefu
    {
    public static void main(String[] args)
    {
      JOptionPane input =new JOptionPane();
      int n=Integer.parseInt(input.showInputDialog("请输入总人数:"));
      Ren a1=new Ren(1,Integer.parseInt(input.showInputDialog("请输入第1个人的密码")));
      Ren index=a1;// j 指向人
      for(int i=2;i<=n;i++)//初始化每个人
      {
       index.next=new Ren(i,Integer.parseInt(input.showInputDialog("请输入第"+i+"个人的密码")));
       index=index.next;
      }
      index.next=a1;
      int m=Integer.parseInt(input.showInputDialog("请输入初始密码:"));
      for(int i=0;i<7;i++)
      {
       for(int k=0;k<m-1;k++)//轮转
       {
        index=index.next;
       }
       System.out.println("第"+index.next.flag+"个人出局");
       input.showMessageDialog(null,"第"+index.next.flag+"个人出局");
       m=index.next.mima;//可以实现剔除后转换为此人拥有的密码.
       index.next=index.next.next;
      }
    }
    public static class Ren//定义人的链表
    {
      private int flag;//序号
      private Ren next;//指针
      private int mima;
      public Ren(int n,int m)
      {
       flag=n;
       mima=m;
      }
    }
    }

    /*

    数小孩的题,相信大家可能在学校的时候都作过,我上学的时候老师也讲过,可就是没好好听,一看见这道题的时候那叫一个后悔啊。
        假设n个小孩围成一圈,每次数第m个小孩,该小孩被踢出来,请问当这帮小,王,八,蛋只剩下一个人的时候是第几个人。(比如m=3,第一次数到第3个,第二次从第4个开始往下数,转圈数)写一个方法来实现。

    */

    import javax.swing.*;

    //改自上一个方法.

    public class Yuesefu
    {
    public static void main(String[] args)
    {
      JOptionPane input =new JOptionPane();
      int n=Integer.parseInt(input.showInputDialog("请输入总人数:"));
      Ren a1=new Ren(1,Integer.parseInt(input.showInputDialog("请输入第1个人的密码")));
      Ren index=a1;// j 指向人
      for(int i=2;i<=n;i++)//初始化每个人
      {
       index.next=new Ren(i,Integer.parseInt(input.showInputDialog("请输入第"+i+"个人的密码")));
       index=index.next;
      }
      index.next=a1;
      int m=Integer.parseInt(input.showInputDialog("请输入初始密码:"));
      for(int i=0;i<7;i++)
      {
       for(int k=0;k<m-1;k++)//轮转
       {
        index=index.next;
       }
       System.out.println("第"+index.next.flag+"个人出局");
       input.showMessageDialog(null,"第"+index.next.flag+"个人出局");
       m=index.next.mima;//可以实现剔除后转换为此人拥有的密码.
       index.next=index.next.next;
      }
    }
    public static class Ren//定义人的链表
    {
      private int flag;//序号
      private Ren next;//指针
      private int mima;
      public Ren(int n,int m)
      {
       flag=n;
       mima=m;
      }
    }
    }

     

     

    展开全文
  • 约瑟夫环javaApplet演示程序(源码)
  • /** * n个人,从第k个人从1开始报数,报到m的人出列,m的下一个人接着从1开始报数,报到m的人出列... * 直到队列只剩一个人,...import java.util.ArrayList; import java.util.List; public class JosephProblem { pu
    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);
    	}
    }
    

    思路是除了集合的元素删除这一点外,约瑟夫环问题每一次淘汰数字的过程很像星期几的问题,即每次数到最后一个数,又要从第一个数开始数,类似于每个星期天后都是星期一
    展开全文
  • 约瑟夫环 java实现

    2018-01-11 10:14:51
    曾经一次笔试,由于准备不足,前面所有题都打完了,但是最后一题,就是手写约瑟夫环,我居然没有写出来,然后。。凉凉了。。 现在再来回顾一下: 问题:有100个人围成一个圈,从1开始报数,报到14的这个人就要退出...
  • 采用循环双链表演示约瑟夫环代码: 由于是带空数据的头结点的循环双链表 所以在操作时显得复杂,仓促写的 package Cir_Double_list; import javax.swing.plaf.TableHeaderUI; import java.util.Arrays; import java...
  • 数据结构浅谈——约瑟夫环 什么是约瑟夫环? 问题描述 ,有一个这样的场景:一堆小孩在操场围成一个圈,他们约定从某个人从1开始报数(类似于报数,1,2,3,…n),规定报到第k个人,第k个人就出列,剩下的继续围...
  • 约瑟夫环java链表实现

    2020-09-16 16:29:32
    public class Main { public static void main(String[] args) { int n = 41,m = 5;//定义总人数n,和出圈数字m //初始化循环列表,头结点first和尾结点p int size = n; Node first = new Node(1);...
  • 纯手写 java 数组模拟链表约瑟夫环问题 有很大更改空间 仅供参考
  • import java.util.Scanner; class Main { static int a[],m,k,n; public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); m = sc.nextInt(); k = sc.nextInt...
  • 约瑟夫环:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
  • 我们首先来看一下约瑟夫环问题:  给定m个人,m个人围成一圈,在给定一个数n,从m个人中的第一个人每第n个人便将其除去,求被最后一个出去的人的编号。  思路:  建立一个长度为m+1的数组,将其的内容初始化为...
  • 约瑟夫环 java循环链表实现

    千次阅读 2017-09-01 11:11:24
    首先看一下算法背景: 罗马人攻占了乔塔帕特,41人藏在一个山洞中躲过了这场浩劫。这41个人中,包括历史学家josephus和他的一个朋友。剩余的39个人为了表示不向罗马人屈服,决定集体自杀。大家决定了一个自杀方案...
  • 思路分析 1.首先需要建立起一个给定大小的环形链表,具体代码如下 public void add(int n) { if (n < 1) { System.out.println("增加个数不正确"); } Boy cutBoy = null; for (int i = 1;...= n...
  • 使用数组模拟 public class Solution { public int LastRemaining_Solution(int n, int m) { if(n|| m) return -1; int[] arr = new int[n]; int step=0; // 计数,数到m就归0 int i = -1; //表示当前位置 ...
  • 约瑟夫环问题具有通用的公式:f(n)=( f(n-1)+m ) % n public class Solution { public int LastRemaining_Solution ( int n , int m ) { if ( n == 0 ) return - 1 ; if ( n == 1 ) ...
  • java约瑟夫环

    2012-10-23 13:22:05
    java约瑟夫环
  • 约瑟夫环问题Java代码实现 详细介绍了约瑟夫环问题 以及java的代码实现

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,697
精华内容 1,878
关键字:

约瑟夫环java

java 订阅