【java版数据结构】死亡游戏约瑟夫避免自杀问题
介绍:
有一天罗马人占领了犹太人的领地,39个犹太人与约瑟夫以及他的朋友躲
到一个山洞中,39个犹太人决定宁愿死也不要被罗马人招降,于是它们决定了一个自杀方式,41个人排成一个圆圈,第一个人从1开始报数,依次往后,如果有人报到3,那么这个人就必须自杀,然后由他的下一个人重新从1开始报数,直到所有人都自杀身亡。然而约瑟夫和他的朋友并不想遵从,于是约瑟夫要他的朋友先假装遵从,他将朋友与自己安排在第16与第31个位置,从而逃过 了这场死亡游戏。
问题转换: 41个人围坐一圈,第一个人编号为1,第二个人编号为2…第n个人编号为n
1.编号为1的人开始从1报数,报数为3的那个人退出圈
2.自退出的那个人开始的下一个人再次从1开始报数,以此类推
3.求出最后退出圈的那个人的编号
解题思路:
1.构建含有41个结点的单向循环链表,分别存储1-41的值,分别代表这41个人
2.使用计数器count,记录当前报数的值
3.遍历链表,每循环一次count++
4.假如count==3,则删除当前结点,并打印删除的结点的值,并把count重置为0
重点:用pre和before指针指向了当前结点下一个结点的上一个结点,方便做连接和删除操作
代码:
public class JosephTest {public static void main(String[] args) {Node first=null;Node pre=null;//1.创建循环链表for (int i = 1; i <=41 ; i++) {//创建第一个结点if (i==1){first = new Node(i, null);//将当前结点变成下一个结点的上一个结点pre=first;continue;}//创建中间结点Node newNode = new Node(i, null);//建立连接pre.next=newNode;//将当前结点变成下一个结点的上一个结点pre=newNode;if (i==41){//建立循环pre.next=first;}}//2.创建计数器,记录报数结果int count=0;//记录每次遍历拿到的结点,默认从首结点开始Node n=first;//记录当前结点的上一个结点,默认从首结点的上一个结点开始nullNode before=null;//3.遍历循环链表while(n!=n.next) {//计数器累加count++;if (count == 3) {// 如果计数到3,删除当前结点,并重置count=0before.next = n.next;count=0;//打印被删除的结点System.out.print(n.item + ",");n = n.next;} else {//将当前结点变成下一个结点的上一个结点before=n;//如果没有计数到3,则往下移动一位n = n.next;}}//打印出剩余到最后的那个人System.out.println(n.item);}
//内部结点类private static class Node<T>{T item;Node next;public Node(T item, Node next) {this.item = item;this.next = next;}}
}
【java版数据结构】死亡游戏约瑟夫避免自杀问题相关推荐
- 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
- Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除(CRUD)
Java版数据结构之单向链表 CRUD Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除; 留了一个疑问; 我的代码仓库:https://github.com/zhuangbinan ...
- Java版数据结构之单向链表
Java版数据结构之单向链表 我的代码仓库:https://github.com/zhuangbinan/datastructure package club.zhuangbinan.linkedli ...
- Java版数据结构之数组模拟环形队列demo
Java版数据结构之数组模拟环形队列demo 我的代码仓库:https://github.com/zhuangbinan/datastructure 类 CircleArray package clu ...
- Java版数据结构与算法——线性表
*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如 ...
- Java版数据结构与算法笔记
文章目录 一.数据结构与算法概述及题目 1.数据结构和算法的关系 2.线性结构与非线性结构 Ⅰ-线性结构 Ⅱ-非线性结构 3.经典面试题 Ⅰ-字符串匹配问题: Ⅱ-汉诺塔游戏 Ⅲ-八皇后问题: Ⅳ-马 ...
- java版数据结构解迷宫问题_C语言数据结构之迷宫问题
本文实例为大家分享了数据结构c语言版迷宫问题栈实现的具体代码,供大家参考,具体内容如下 程序主要参考自严蔚敏老师的数据结构c语言版,在书中程序的大体框架下进行了完善.关于迷宫问题的思路可查阅原书. # ...
- 学生信息管理系统实习报告(java版数据结构)
一. 问题分析 1.1 什么是学生信息管理系统以及研究意义 学生信息管理系统是校园网络中一个重要的应用系统,它大大改善了学校教学.科研与管理的基础环境,在一定程度上反映出学校管理现代化的水平.信息管理 ...
- 【java版数据结构】看完数据结构的顺序结构后,紧接着去实现ArrayList的底层(150行代码,数组扩容,增删改查,但未实现迭代器)
实现效果: 需求分析: 可以看到ArrayList容器有很多功能,在指定位置添加元素,在容器末尾添加元素,获取指定位置的元素,获取容器的大小,清空容器的元素,判断容器是否是空的,删除指定位置的元素,删 ...
最新文章
- J-LINK不能烧写(错误:JLink Warning: RESET (pin 15) high, but should be low. Please check target)
- 【最优解】Leecode 594. 最长和谐子序列——Leecode每日一题系列
- aix 安装oracle9,IBM P570 小型机AIX5.3系统安装ORACLE9i
- 指尖初体验之主屏幕操作
- django orm_Django ORM简介
- 蓝桥杯51单片机之利用中断实现倒计数与停表【单片机开发初学者掌握案例】
- Java逆向工程SpringBoot + Mybatis Generator + MySQL
- Vue同级组件数据传递
- 以$开头的shell脚本的变量
- Java 类加载器揭秘
- 运维面试官喜欢问的问题
- Gartner:细分分析如何提高销售预测的准确性?
- 基于开源软件构建高性能集群NAS系统
- 文件在服务器中存储,如何发送音频文件在服务器中存储
- matlab bar3 颜色,matlab中怎么控制柱状图标注的颜色?
- 十六进制数高位和低位的结合与分离
- vi和vt的区别小窍门_十大vi技巧和窍门
- proteus学习笔记一:点亮LED
- 利用OGR处理几何要素
- Python模拟登录某橙色软件并获取所有订单,康康买了啥奇奇怪怪的东西?