博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法(1)-约瑟夫
阅读量:6229 次
发布时间:2019-06-21

本文共 3137 字,大约阅读时间需要 10 分钟。

hot3.png

  • 1、算法介绍

约瑟夫算法的介绍:

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

  • 2、算法的思路

    以下为log信息,帮助理解实现思路

所有的数据为:   1   2   3   4   5   6   7   8   9   10第1次循环,数据为:   1   2   3   4   5   6   7   8   9   10 -----------被删除的数据为:6第2次循环,数据为:   7   8   9   10   1   2   3   4   5 -----------被删除的数据为:2第3次循环,数据为:   3   4   5   7   8   9   10   1 -----------被删除的数据为:9第4次循环,数据为:   10   1   3   4   5   7   8 -----------被删除的数据为:7第5次循环,数据为:   8   10   1   3   4   5 -----------被删除的数据为:5第6次循环,数据为:   8   10   1   3   4 -----------被删除的数据为:8第7次循环,数据为:   10   1   3   4 -----------被删除的数据为:1第8次循环,数据为:   3   4   10 -----------被删除的数据为:10第9次循环,数据为:   3   4 -----------被删除的数据为:4总数:[10]  需要删除掉的数据的位置:[6]  最后一个被删除掉的数据[3]

    主要的实现思想:

    2.1、两个list:一个装之前已经读过的数据,一个装还没有读过的数据

    2.2、从没有读过的数据里面删除应该删除的数据。

        每次到应该删除的数据以后,将已经读过的数据放到没有读过的后面,之后再将已经读过的数据清空掉

        如果没有读过的数据,已经为空了,那么则需要将已经读过的数据再加进去,并将已经读过的数据清空

    2.3、判断,如果已经读过的数据list长度为1,未读数据为空,则结束循环

  • 3、具体的代码实现
/** * 约瑟夫算法的实现 * 约瑟夫算法的介绍: * 约瑟夫环:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数, * 数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去, * 直到圆桌周围的人全部出列 */public class YuesefuTest {    public static void main(String[] args) {        int total = 5;        int removeAt = 3;//        patternTwo(total, removeAt);//        patternTwo(10, removeAt);        patternTwo(10, 6);//        testOne();    }    private static void testOne(){        ArrayList
unReadList = new ArrayList
();//没有读过的list ArrayList
readedList = new ArrayList
();//已经读过的list for(int i = 0;i< 5;i++){ unReadList.add(i); } for(int i = 5;i<10;i++){ readedList.add(i); } readedList.addAll(readedList.size(),unReadList); unReadList.clear(); System.out.println("所有的数据:"); for(int i = 0;i
unReadList = new ArrayList
();//没有读过的list ArrayList
readedList = new ArrayList
();//已经读过的list for(int i = 1;i<=total;i++){ unReadList.add(i); } System.out.println("所有的数据为:"); printAllNum(unReadList); int loopCount = 1; while(true){ System.out.println("第"+loopCount+"次循环,数据为:"); printAllNum(unReadList); for(int i = 1;i< removeAt;i++){ if(unReadList.size() == 0){//如果没有读过的数据,已经为空了,那么则需要将已经读过的数据再加进去,并将已经读过的数据清空 unReadList.addAll(unReadList.size(),readedList); readedList.clear(); } int value = unReadList.remove(0); readedList.add(value); } if(unReadList.size() == 0){ unReadList.addAll(unReadList.size(),readedList); readedList.clear(); } int i = unReadList.remove(0);//从没有读过的数据里面删除应该删除的数据。 System.out.print(" -----------被删除的数据为:"+i+"\n"); //每次到应该删除的数据以后,将已经读过的数据放到没有读过的后面,之后再将已经读过的数据清空掉 unReadList.addAll(unReadList.size(),readedList); readedList.clear(); loopCount++; if(unReadList.size() == 1 && readedList.size() == 0){//判断,如果已经读过的数据list长度为1,未读数据为空,则结束循环 break; } } System.out.println("总数:["+total+"] 需要删除掉的数据的位置:["+removeAt+"] 最后一个被删除掉的数据["+unReadList.get(0)+"]"); } private static void printAllNum(ArrayList
allNum){ if(null != allNum && allNum.size() > 0) { System.out.println(); for (int i =0;i

 

转载于:https://my.oschina.net/u/2253892/blog/2908235

你可能感兴趣的文章
vsftp简单学习思考
查看>>
HTTP协议缓存策略深入详解之ETAG妙用
查看>>
Asp.Net WebApi 项目及依赖整理
查看>>
【Spring源码分析】非懒加载的单例Bean初始化过程(下篇)
查看>>
如何选择 compileSdkVersion, minSdkVersion 和 targetSdkVersion
查看>>
8 -- 深入使用Spring -- 4...5 AOP代理:基于注解的“零配置”方式
查看>>
1. 自动化运维系列之Cobbler自动装机
查看>>
《数据结构》读书笔记
查看>>
Ubuntu下删除卸载程序图标
查看>>
java和C#异常处理的差异
查看>>
Android 监听apk安装替换卸载广播
查看>>
指针之——一级二级多级指针
查看>>
AndroidStudio遇到过的问题
查看>>
MySQL整体架构与内存结构
查看>>
线上centos6出现软死锁 kernel:BUG: soft lockup
查看>>
pl/sql developer 自动输入替换 光标自动定位
查看>>
HTML5学习笔记(二十三):DOM应用之动态加载脚本
查看>>
Java 中的悲观锁和乐观锁的实现
查看>>
XAMPP permissions on Mac OS X
查看>>
ffmpeg
查看>>