约瑟夫问题 Josephus problem

又叫丢手绢问题,N个人围成一圈,第K个人从1开始报数,数到M的人出圈,后一人接着从1开始报数,直到最后剩下一个。例如N=5,K=1,M=2,出圈的顺序是:2,4,1,5,3

基本思路:

  1. 将最开始环形链表的第一位命名为first,并定义另一个指针helper帮助计算,helper指向最开始环形链表的最后一位。
  2. first 和 helper 一起向前移动,每一次循环中被first指向的节点出圈
  3. 直到最终 helper = first,说明只剩下最后一个节点

遍历法代码如下:

//定义Node3,每一个Node就是一个节点
class Node3 {// 节点序号private int no;// 下一个节点private Node3 next;// 构造节点public Node3(int no) {this.setNo(no);}public Node3 getNext() {return next;}public void setNext(Node3 next) {this.next = next;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}}//利用单向链表创建一个环形链表
class CLinkedList {// 创建一个first节点private Node3 first = null;// 添加 n 个节点public void add(int n) {// 检查 n 是否有效if (n < 1) {System.out.println("N is not valid!");return;}Node3 temp = null;// 创建环形链表for (int i = 1; i <= n; i++) {Node3 node = new Node3(i);if (i == 1) {first = node;first.setNext(first); // 形成环temp = first; // 让 temp 指向第一个节点} else {temp.setNext(node);node.setNext(first);temp = node;}}}/*** 丢手绢游戏 int startNo 表示从第几个小孩开始 int count 表示要数几下 int nums表示开始总共有多少个小孩在圈内*/public void play(int startNo, int count, int nums) {// 先检验数据的有效性if (first == null || startNo < 1 || startNo > nums) {System.out.println("Please input the right numbers!");return;}// 创建 helper 变量帮助计算出圈,helper 指向环形链表的最后一位Node3 helper = first;while (true) {if (helper.getNext() == first) {break;}helper = helper.getNext();}// 如果不是从第一位小孩开始,就需要将 first 和 helper 向前移动,让 first 指向开始的小孩for (int i = 0; i < startNo - 1; i++) {first = first.getNext();helper = helper.getNext();}// 当小孩开始报数时,first 和 helper 需要移动 count-1 次,然后出圈// 循环操作直到还剩最后一个小孩while (true) {// 当 helper 和 first 向遇,证明只剩最后一个小孩if (helper == first) {break;}// first 和 helper 向后移动 count+1 位for (int i = 0; i < count - 1; i++) {first = first.getNext();helper = helper.getNext();}// first 指向的小孩出圈System.out.println("第" + first.getNo() + "个小孩出圈");first = first.getNext();helper.setNext(first);}System.out.println("最后留在圈中的小孩是第" + first.getNo() + "个");}

相关章节
第一节 简述
第二节 稀疏数组 Sparse Array
第三节 队列 Queue
第四节 单链表 Single Linked List
第五节 双向链表 Double Linked List
第六节 单向环形链表 Circular Linked List
第七节 栈 Stack
第八节 递归 Recursion
第九节 时间复杂度 Time Complexity
第十节 排序算法 Sort Algorithm
第十一节 冒泡排序 Bubble Sort
第十二节 选择排序 Select Sort
第十三节 插入排序 Insertion Sort
第十四节 冒泡排序,选择排序和插入排序的总结
第十五节 希尔排序 Shell’s Sort
第十六节 快速排序 Quick Sort
第十七节 归并排序 Merge Sort

算法与数据结构(约瑟夫问题)相关推荐

  1. 算法与数据结构——约瑟夫生者死者游戏

    一.概要设计 编写一个选择第9人进行杀死的函数,由两个循环嵌套,外循环计算总杀死人数,内循环计算第9人,返回人数为存活人数.其中要注意跳过数据域为空的头指针. 总函数中利用循环创建单循环链表,利用数组 ...

  2. 算法与数据结构学习资料及面试

    from 算法之美作者:  http://blog.csdn.net/tiandijun/article/details/50550056 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录( ...

  3. 格雷通路 算法 java,Java算法与数据结构教程

    北上广容不下肉身, 三四线放不下灵魂, 程序员里没有穷人, 有一种土豪叫 算法工程师. 程序 = 数据结构 + 算法 程序是为了解决实际问题而存在的.然而为了解决问题,必定会使用到某些数据结构以及设计 ...

  4. 一看“左程云:200道算法与数据结构”,二刷“阿里云:70+算法题、30种大厂笔试高频知识点”,3月过去终于挺进我梦中的字节!

    不管是学生还是已经工作的人,我想彼此都有一个相同的梦想:进大厂! 眼看着2020年还有个三十来天就要完美收尾了,那么如何才能在未来三个月弯道超车赶上"金三银四的春招",进入梦寐以求 ...

  5. 数据结c语言约瑟夫环实验报告,数据结构约瑟夫环实验报告.doc

    数据结构约瑟夫环实验报告.doc 数据结构与算法设计约瑟夫环实验报告实验一专业物联网工程班级物联网1班学号15180118姓名刘沛航一. 实验目的 1.熟悉VC环境,学习使用C语言利用链表的存储结构解 ...

  6. 算法和数据结构(Java语言)

    算法和数据结构(Java语言) 持续更新中- 线性结构和非线性结构 线性结构 线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系 线性结构有两种不同的存储结构,即顺序存储结构和链式 ...

  7. GitHub上分享的常用算法和数据结构实现原理可视化系统

    一门编程语言入门之后,要想进阶,必须学习算法和数据结构,但是对于初学者来讲算法和数据结构和数据结构的实现原理和机制过于枯涩.抽象难懂. 这里为小伙伴们分享一个名为Algorithm Visualize ...

  8. 维基百科上的算法和数据结构链接很强大

    突然发现维基百科上的算法和数据结构比百度百科强多啦,图文并茂. 其实这个网站不错:http://www.sorting-algorithms.com 冒泡排序: bubble冒泡的意思 http:// ...

  9. GitHub标星3w+的项目,全面了解算法和数据结构知识

    作者 | 程序员小吴 来源 | 五分钟学算法(ID: CXYxiaowu) 导语:今天分享一个开源项目,里面汇总了程序员技术面试时需要了解的算法和数据结构知识,并且还提供了相应的代码,目前 GitHu ...

  10. noj数据结构稀疏矩阵的加法十字链表_一个算法毁了一款好游戏?算法和数据结构到底有多重要?...

    来源 | 异步 | 文末赠书 前段时间大火的国产游戏--<太吾绘卷>,由于创新的玩法和精良的制作一度广受好评,然而随着玩家游戏的深入和时长的积累,发现该游戏在玩的过程中游戏外的问题很多很多 ...

最新文章

  1. mybatis整合ehcache
  2. OK,让我们开始吧!
  3. Chapter8 用例建模
  4. 在XenApp如何发布SAP的客户端(上)
  5. powercfg -h off_万代 S.H.Figuarts「假面骑士01 金属腾蝗形态」
  6. Runnable Thread分析比较
  7. mysql压缩包安装教程8.0.19,win10安装zip版MySQL8.0.19的教程详解
  8. Android:随笔—— ConstraintLayout 效率爆表的技巧
  9. android设置自动开关机,Android开发之设置开机自动启动的几种方法
  10. 一致性hash算法Consistent Hashing
  11. 清华EMBA课程系列思考之十七(1) -- 新企业的孵化与创业投资
  12. tomcat是干什么的? 什么叫web容器以及作用?
  13. stack容器—C++笔记
  14. MyBatis 学习(七):深入 Mapper XML映射文件
  15. ssm毕设项目酒店管理系统08281(java+VUE+Mybatis+Maven+Mysql+sprnig)
  16. STM32CubeMX生成工程失败
  17. 软件测试49个必问面试题合集+答案
  18. 去广告插件——火狐浏览器
  19. 基于PHP使用rabbitmq实现消息队列
  20. Win系统 - 色域、IPS、TN傻傻分不清楚?

热门文章

  1. matlab提excel文字,matlab读取excel文字
  2. SYDTEK OTA 蓝牙升级功能实现 附带Demo
  3. mysql 子查询添加索引_mysql – 你能索引子查询吗?
  4. python super 参数问题
  5. python 条形图图注怎么集中注意力_如何用每个条形图的总和(Matplotlib)注释堆积条形图?...
  6. 递归行为时间复杂度估算
  7. tensorflow就该这么学--5( 神经网络基础)
  8. MATLAB从入门到精通:MATLAB矩阵操作
  9. 过拟合(原因、解决方案、原理)
  10. mysql 进阶到高级_mysql的高级进阶(一)