java实现简单的约瑟夫环问题
我自己学习数据结构的时候,总希望能找到很简单的入门代码,可总是很难找到,于是就想到能写一些简单的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实现简单的约瑟夫环问题相关推荐
- java实现简单的约瑟夫环问题(二)
Josephus(约瑟夫)问题的数学方法 前面的内容都是直接来来自于百度百科,后面才是我对这段话的理解 无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间 ...
- java实现约瑟夫环完整算法_Java简单实现约瑟夫环算法示例
Java简单实现约瑟夫环算法示例 发布时间:2020-10-01 14:19:56 来源:脚本之家 阅读:104 作者:perfect亮 本文实例讲述了Java简单实现约瑟夫环算法.分享给大家供大家参 ...
- [剑指offer][JAVA][第62题][约瑟夫环][LinkedList vs ArrayList]
[问题描述] 面试题62. 圆圈中最后剩下的数字 0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字.例如,0.1.2.3.4这5个 ...
- 【约瑟夫环】Java实现:100个人开始从1开始报数,每当报数到3,报数3的人离开,求最后留下来人的位置。
[约瑟夫环]Java实现:100个人开始从1开始报数,每当报数到3,报数3的人离开,求最后留下来人的位置. 原创 2017年03月15日 00:21:36 标签: 约瑟夫环问题 1023 问题背景:约 ...
- Java实现约瑟夫环问题
约瑟夫环问题起源于一个犹太故事.约瑟夫环问题的大意如下: 罗马人攻占了桥塔帕特,41个人藏在一个山洞中躲过了这场浩劫.这41个人中,包括历史学家Josephus(约瑟夫)和他的一个朋友.剩余的39个人 ...
- 用java解决约瑟夫循环问题,Java实现循环列表解决约瑟夫环问题
约瑟夫环:共有n个人围成一圈,从1开始报数,数到m的人出圈,求最后幸运者序号?? 下面用Java实现循环列表解决这个问题: package com.iteye.ljmdbc7a; import jav ...
- 约瑟夫环算法(JAVA)
约瑟夫环算法(JAVA) 简介:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1 ...
- 约瑟夫环代码展示,以及理解约瑟夫环
本人也是刚刚接触算法,如果有不准确的地方,欢迎大家留言评论,一起学习,一起进步,奥利给! 约瑟夫环的简单的图例(画的太抽象,大家理解下,我有必要去学学画画了!) 约瑟夫环的原理 1.一群人围在一起坐成 ...
- 1823. 找出游戏的获胜者( 约瑟夫环问题 )
文章目录 Question Ideas 1.Answer( Java ) Code 2.Answer( Java ) Code 3.Answer( Java ) Code Question 1823. ...
最新文章
- C#创建和调用DLL
- python创建只包含一个元素的元组时_Python 创建包含列表的元组
- transformers库的使用【二】tokenizer的使用,模型的保存自定义
- RocketMQ-什么是死信队列?怎么解决
- 如何用cocos2d-x来开发简单的Uphone游戏:(二) 移动的精灵
- 第十节: 利用SQLServer实现Quartz的持久化和双机热备的集群模式
- 如何注释python中html,Python在HTML中提取带注释的代码,python,html,被
- ES6中object对象属性
- MySQL入门 (七) : 储存引擎与资料型态
- php获取apk中文应用名,php提取apk包信息 - 搜知道网 - 搜知道社区,C, iOS,Android,golang 等的知识....
- 8.21 :odd??:nth-of-type??
- App Cleaner Uninstaller卸载清理工具 for mac
- 机器人学中一些常用的三角函数公式
- 转载:稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB
- 红孩儿编辑器的详细设计第二部分
- 我们为什么需要实时数据库?
- 计算机老出现无法响应,win7电脑经常出现“程序未响应”的提示怎么办?
- python中常用的模块(cleandar模块,time模块,datetime模块,OS模块,shutil()模块,random模块)
- TaefTestParser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
- Python 分别获取日期中的年月日时分秒
热门文章
- 某娱乐资源网同款网站源码
- 【新手教程】CE找武林外传基址方法
- javascript下的arguments,caller,callee,call,apply示例及理解
- pythonの鉴黄之路(四)——urllib模块批量下载
- LeetCode 669. Trim a Binary Search Tree
- LeetCode 413. Arithmetic Slices
- 【今日CV 计算机视觉论文速览 第110期】Thu, 2 May 2019
- shell脚本if和switch语句编写案例
- 寒假作业 使用xmind脑图小结课程内容
- HTML5新增标签 0303