我自己学习数据结构的时候,总希望能找到很简单的入门代码,可总是很难找到,于是就想到能写一些简单的java代码。  在百度百科上面搜索到约瑟夫环的问题时,并没有发现java的简单实现,自己在下面弄也是弄了很久,慢慢整理了自己的思路写出了下面的代码。

import java.util.ArrayList;
/*约瑟夫环是一个数学的应用问题:
 * 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
 * 从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,
 * 数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
      例子
  n = 9, k = 1, m = 5  
 
【解答】   出局人的顺序为5, 1, 7, 4, 3, 6, 9, 2, 8。
*/
public class JOSEPHUS {
 public static void main(String[] args) {
  int n = 9, k = 1, m = 5 ;
  ArrayList<Integer> list=new ArrayList<Integer>(n);
  //初始化一些数据
  for(int i=1;i<=n;i++){
   list.add(i);
  }
  
  int i=k-1,t=1; //初始化下标和计数器
  while(!list.isEmpty()){
   if(t==m){         
     System.out.print(list.remove(i)+"  ");
     i--;//删除过后,i的下标已经变化了,所以需要减少
     t=0;//记数器重新归零
   }
   t++;i++;//往下加
   if(i>=list.size()){//如果到末尾了,就直接跳到开始位置
    i=0;
   }
   }
 }
}
 用ArrayList实现过后,我又思考,能不能直接用数组来写呢?答案是肯定的!呵呵……而且用数组的话,系统的开销一定会比上面用arraylist小得多。下面就是用数组实现的代码了:

public class JOSEPHUS_WITH_ARRAY {
 public static void main(String[] args) {
  int n = 9, k = 1, m = 5;
  int[] list = new int[n];
  // 初始化一些数据
  for (int i = 0; i < n; i++) {
   list[i] = i + 1;
  }

int i = k - 1, t = 1; // 初始化下标和计数器
  int count = 0;
  boolean isdel = false;
  while (true) {
   if (t == m) {
    System.out.print(list[i % n] + "  ");
    list[i % n] = -1;
    count++;
    isdel = true;/*引入isdel是为了使当list[i]变成-1后不会对后面
     * 判断执行i++还是i++;t++;产生错误的影响*/
    t = 0;// 记数器重新归零
   }
   if (count >= n)//如果都杀完了,就跳循环了,结束程序的执行
    break;
   if (list[i % n] == -1 && !isdel) {
    i++;// 往下加
    isdel = false;
   } else {
    if (list[(i + 1) % n] != -1) {/*这里的判断很关键,这里面其它也包含了一种思想,只考虑两步。如果出现了list[i]=-1同时list[i+1]=-1,那么只是下标移动,而计数器是不能加1的*/
     i++;
     t++;
    } else {
     i++;
    }
   }
  }
 }
}

关于用i%n,即用数组的下标去对数组的长度求余,也是后来才想到的,这样能保证数组永远不会出现越界的情况,而且可以实现类似于循环队列的效果。

转载于:https://blog.51cto.com/sbp810050504/682574

java实现简单的约瑟夫环问题相关推荐

  1. java实现简单的约瑟夫环问题(二)

    Josephus(约瑟夫)问题的数学方法 前面的内容都是直接来来自于百度百科,后面才是我对这段话的理解 无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间 ...

  2. java实现约瑟夫环完整算法_Java简单实现约瑟夫环算法示例

    Java简单实现约瑟夫环算法示例 发布时间:2020-10-01 14:19:56 来源:脚本之家 阅读:104 作者:perfect亮 本文实例讲述了Java简单实现约瑟夫环算法.分享给大家供大家参 ...

  3. [剑指offer][JAVA][第62题][约瑟夫环][LinkedList vs ArrayList]

    [问题描述] 面试题62. 圆圈中最后剩下的数字 0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字.例如,0.1.2.3.4这5个 ...

  4. 【约瑟夫环】Java实现:100个人开始从1开始报数,每当报数到3,报数3的人离开,求最后留下来人的位置。

    [约瑟夫环]Java实现:100个人开始从1开始报数,每当报数到3,报数3的人离开,求最后留下来人的位置. 原创 2017年03月15日 00:21:36 标签: 约瑟夫环问题 1023 问题背景:约 ...

  5. Java实现约瑟夫环问题

    约瑟夫环问题起源于一个犹太故事.约瑟夫环问题的大意如下: 罗马人攻占了桥塔帕特,41个人藏在一个山洞中躲过了这场浩劫.这41个人中,包括历史学家Josephus(约瑟夫)和他的一个朋友.剩余的39个人 ...

  6. 用java解决约瑟夫循环问题,Java实现循环列表解决约瑟夫环问题

    约瑟夫环:共有n个人围成一圈,从1开始报数,数到m的人出圈,求最后幸运者序号?? 下面用Java实现循环列表解决这个问题: package com.iteye.ljmdbc7a; import jav ...

  7. 约瑟夫环算法(JAVA)

    约瑟夫环算法(JAVA) 简介:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1 ...

  8. 约瑟夫环代码展示,以及理解约瑟夫环

    本人也是刚刚接触算法,如果有不准确的地方,欢迎大家留言评论,一起学习,一起进步,奥利给! 约瑟夫环的简单的图例(画的太抽象,大家理解下,我有必要去学学画画了!) 约瑟夫环的原理 1.一群人围在一起坐成 ...

  9. 1823. 找出游戏的获胜者( 约瑟夫环问题 )

    文章目录 Question Ideas 1.Answer( Java ) Code 2.Answer( Java ) Code 3.Answer( Java ) Code Question 1823. ...

最新文章

  1. C#创建和调用DLL
  2. python创建只包含一个元素的元组时_Python 创建包含列表的元组
  3. transformers库的使用【二】tokenizer的使用,模型的保存自定义
  4. RocketMQ-什么是死信队列?怎么解决
  5. 如何用cocos2d-x来开发简单的Uphone游戏:(二) 移动的精灵
  6. 第十节: 利用SQLServer实现Quartz的持久化和双机热备的集群模式
  7. 如何注释python中html,Python在HTML中提取带注释的代码,python,html,被
  8. ES6中object对象属性
  9. MySQL入门 (七) : 储存引擎与资料型态
  10. php获取apk中文应用名,php提取apk包信息 - 搜知道网 - 搜知道社区,C, iOS,Android,golang 等的知识....
  11. 8.21 :odd??:nth-of-type??
  12. App Cleaner Uninstaller卸载清理工具 for mac
  13. 机器人学中一些常用的三角函数公式
  14. 转载:稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB
  15. 红孩儿编辑器的详细设计第二部分
  16. 我们为什么需要实时数据库?
  17. 计算机老出现无法响应,win7电脑经常出现“程序未响应”的提示怎么办?
  18. python中常用的模块(cleandar模块,time模块,datetime模块,OS模块,shutil()模块,random模块)
  19. TaefTestParser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
  20. Python 分别获取日期中的年月日时分秒

热门文章

  1. 某娱乐资源网同款网站源码
  2. 【新手教程】CE找武林外传基址方法
  3. javascript下的arguments,caller,callee,call,apply示例及理解
  4. pythonの鉴黄之路(四)——urllib模块批量下载
  5. LeetCode 669. Trim a Binary Search Tree
  6. LeetCode 413. Arithmetic Slices
  7. 【今日CV 计算机视觉论文速览 第110期】Thu, 2 May 2019
  8. shell脚本if和switch语句编写案例
  9. 寒假作业 使用xmind脑图小结课程内容
  10. HTML5新增标签 0303