写在前面: 我是 「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的

这博客是对自己学习的一点点总结及记录,如果您对 Java算法 感兴趣,可以关注我的动态,我们一起学习。

用知识改变命运,让我们的家人过上更好的生活

相关文章

点此查看 【算法系列】 博客文章


文章目录

  • 一、问题描述
  • 二、问题分析
  • 三、实现逻辑
  • 四、代码实现

一、问题描述

约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢问题”。)

据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

二、问题分析

这个问题可以这样来看,有N个人围成一圈,第一个人从1开始报数,报到3的出圈被杀掉;下一个人接着从1开始报数… …这样循环反复,直到剩下最后两个人,求出最后两个人的位置。

三、实现逻辑

1. 构建一个单向循环链表(链表的尾部指向开头)

① 首先创建循环链表的头节点,让head指向该节点,并形成环形;

② 之后每当创建一个新的节点,就把该节点添加到已有的环形链表中

2. 遍历单向的循环链表

在此遍历中,当有节点被删除以后,就要向后移动节点。

注意

当当前节点的值等于当前节点的下一个节点的值的时候,循环结束

四、代码实现

package com.study.algorithm;import java.util.Scanner;/*** @Description: 使用循环链表解决约瑟夫环问题* @Author: 扬帆向海* @Date: Created in 2020/5/2*/
public class JosephCircle {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("请输入总人数N(N>=2):");int n = scanner.nextInt();if (n < 2) {System.out.println("您好!请确保输入的人数大于等于 2");return;}// 构建链表并获取头节点,把头节点赋值给currentNodeNode currentNode = buildData(n);// 用来计数int count = 0;// 循环链表当前节点的上一个节点Node beforeNode = null;// 遍历循环链表while (currentNode != currentNode.next) {count++;if (count == 3) {// 向后移动节点beforeNode.next = currentNode.next;System.out.println("出环的编号是: " + currentNode.data);count = 0;currentNode = currentNode.next;} else { // 向后移动节点beforeNode = currentNode;currentNode = currentNode.next;}// 表示只有两个节点了,不再进行出环操作if (beforeNode.data == currentNode.next.data) {break;// 跳出循环}}// 输出最后留在环中的编号System.out.println("最后留在环中的编号是: " + currentNode.data + "," + currentNode.next.data);}/*** 构建单向循环链表** @param n 人数* @return 返回头节点*/private static Node buildData(int n) {// 循环链表的头节点Node head = null;// 循环链表当前节点的前一个节点Node prev = null;for (int i = 1; i <= n; i++) {Node newNode = new Node(i);// 如果是第一个节点if (i == 1) {head = newNode;prev = head;// 跳出当前循环,进行下一次循环continue;}// 如果不是第一个节点prev.next = newNode;prev = newNode;// 如果是最后一个节点if (i == n) {prev.next = head;}}return head;}
}/*** 链表节点*/
class Node {// 当前存储的数据int data;// 当前节点的下一个节点Node next;public Node(int data) {this.data = data;}
}

测试结果:

请输入总人数:41
出环的编号是: 3
出环的编号是: 6
出环的编号是: 9
出环的编号是: 12
出环的编号是: 15
出环的编号是: 18
出环的编号是: 21
出环的编号是: 24
出环的编号是: 27
出环的编号是: 30
出环的编号是: 33
出环的编号是: 36
出环的编号是: 39
出环的编号是: 1
出环的编号是: 5
出环的编号是: 10
出环的编号是: 14
出环的编号是: 19
出环的编号是: 23
出环的编号是: 28
出环的编号是: 32
出环的编号是: 37
出环的编号是: 41
出环的编号是: 7
出环的编号是: 13
出环的编号是: 20
出环的编号是: 26
出环的编号是: 34
出环的编号是: 40
出环的编号是: 8
出环的编号是: 17
出环的编号是: 29
出环的编号是: 38
出环的编号是: 11
出环的编号是: 25
出环的编号是: 2
出环的编号是: 22
出环的编号是: 4
出环的编号是: 35
最后留在环中的编号是: 16,31

由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!

毕业生求职必会算法 约瑟夫环问题相关推荐

  1. 严蔚敏算法约瑟夫环_极客算法训练笔记(三),链表详细图解,别再逃避了朋友...

    目录 缓存引爆链表 链表 单链表 双向链表 循环链表 双向循环链表 LinkedHashMap实现LRU缓存,源码解析(JDK1.8) 算法 爬楼梯 算法 反转链表 算法 链表环检测 缓存引爆链表 存 ...

  2. python约瑟夫环问题给十个学生编号报到3者出列_趣味算法--约瑟夫环问题(示例代码)...

    问题描述 已知n个人(以编号1,2,3,...,n分别表示)围坐在一张圆桌上.指定编号为k的人开始从1报数,数到m的那个人出列:出列那个人的下一位又从1开始报数,数到m的那个人出列:以此规则重复下去, ...

  3. 算法-约瑟夫环问题——python实现

    Hello NanFeng 遇到了一个有点意思的题: 一艘船上有30个人,现在因为超载需要15人下船,决策者采用了一种很特殊的抽签方式 1.先让人们排成一列,按照顺序给每个人编号 2.依次从1开始报数 ...

  4. 毕业生求职必看的六部经典电影

    应届大学生现即将毕业,在金融危机的时期,毕业生应该怎样抓住求职找工作的机会呢?你是否还在为求职而迷茫.彷徨和无助呢?那么看看下面的几部片子吧!这些影生会告诉你在求职中要用什么心态来规划自己的求职之路. ...

  5. 算法-约瑟夫环问题(丢手绢问题)

    1.一群猴子排成一圈,按1,2,-,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去-,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫 ...

  6. 程序员求职面试必会算法!会不断更新

    写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字.我热爱技术.热爱开源.热爱编程.技术是开源的.知识是共享的. 这博客是对自己学习的一点点总结及记录,如果您对 Java.算法 感兴 ...

  7. 一文读懂约瑟夫环算法

    2020-05-25 20:13:40 作者 | 扬帆向海 责编 | 王晓曼 出品 | CSDN博客 问题描述 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的 ...

  8. 消除左递归c++代码_【每日算法Day 85】图解算法:一行代码解决约瑟夫环的变体...

    题目链接 LeetCode 390. 消除游戏[1] 题目描述 给定一个从 到 排序的整数列表. 首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾. 第二步,在剩下的数字中,从右 ...

  9. 数据结构与算法--我们来玩丢手绢(约瑟夫环问题)

    我们来玩丢手绢 昨天我们打扑克,今天我们丢手绢 丢手绢我们都知道这个游戏,他的由来由约瑟夫 (Josephus)提出来的 据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,3 ...

最新文章

  1. Pandas常见的性能优化方法
  2. JS 设计模式之初识(一)-单例模式
  3. CentOS7 Tomcat安装
  4. UA OPTI570 量子力学 公式与结论总结1 角动量基础
  5. git checkout -b mybranch和git checkout mybranch
  6. 在编写异步方法时,使用 ConfigureAwait(false) 避免使用者死锁
  7. C语言、嵌入式中几个非常实用的宏技巧
  8. win7设置定时锁定计算机,Win7系统锁定计算机怎么设置?Win7系统锁定计算机的设置方法...
  9. IDEA 安装插件Plugin 'Scala' is incompatible with this installation
  10. python learning2.py
  11. paip.语义分析--分词--常见的单音节字词 2_deDuli 单字词 774个
  12. php 查看session 时间,php中session过期时间设置及session回收机制介绍
  13. 2019年,微信营销软件排行榜
  14. QT5+VS201: QTCharts:设置坐标轴间隔以及标注
  15. 从EXCEL导入CAD后如何设置表格文字大小?
  16. python求单词长度_python 统计单词平均长度,统计a出现的次数
  17. bartender的安全策略不允许指定的用户执行此操作_Linux sudo 被曝提权漏洞,任意用户均能以 root 身份运行命令
  18. 反弹中快速获利的操盘技巧
  19. 免费WAP改变自我现状 谈四个赢利途
  20. Shader中的 mul()函数解释

热门文章

  1. 详解图像二值化 函数threshold
  2. 无法访问网上邻居/网络打印机的解决方法
  3. 我的开源项目--华尔街见闻(仿)
  4. 火狐linux 32位,火狐浏览器32.0版本-Firefox(火狐浏览器)32.0版下载 v32.0官方版--pc6下载站...
  5. sap文档服务器,SAP程序文档管理方案
  6. 如何度过中年危机(转)
  7. Python_Task01:变量、运算符、数据类型及位运算
  8. 无线充电怎么测试软件,无线充电测试难点及解决方案
  9. XSSFWorkbook 设置单元格样式_6.6 使用单元格样式
  10. GraphicsLab Project之光照贴图烘焙(一)