约瑟夫环详解

2023-05-16

package newjosephu;

public class myfinaljosephu {
    //你可能会说crazy
    //我只想说ez!
    public static void main(String[] args)
    {
        circlelinkedlist list = new circlelinkedlist();
        list.add(100);
        //list.shownode();
        list.outnode(2,1);
    }

}
class circlelinkedlist
{
    node first  = null;
    public void add(int num)
    {
        node curnode = null;
        for(int i=1;i<=num;i++)
        {
            node s = new node(i);
            if(i==1)
            {
                first = s;
                first.next = first;
                curnode = first;
            }
            else
            {
                curnode.next = s;
                s.next = first;
                curnode = curnode.next;
            }
        }
    }
    public void shownode()
    {
        node s = first;
        while(true)
        {
            System.out.println(s.number);
            if(s.next==first)
            {
                break;
            }
            s = s.next;
        }
    }
    public void outnode(int count,int no)
    {
        //count 是数几次
        //sum 是有几个数,跟前面的比较
        //no 是从第几个开始数
        node helper = first;
        //helper是位于first之后的一个指针
        while(helper.next!=first)
        {
            helper = helper.next;
        }
        //从第几个人开始数
        for(int i=0;i<no-1;i++)
        {
            first = first.next;
            helper = helper.next;
        }
        //数几次--直到最后一个
        while(helper!=first)
        {
        for(int i=0;i<count-1;i++)
        {
            first = first.next;
            helper = helper.next;
        }
        System.out.println(first.number+"出圈了!");
        first = first.next;
        helper.next = first;
        }
        System.out.println("最后幸存的是"+first.number);
    }
}
class node
{
    int number;
    node next;
    public int getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = number;
    }
    public node(int number) {
        super();
        this.number = number;
    }
    public node getNext() {
        return next;
    }
    public void setNext(node next) {
        this.next = next;
    }

    public String toString() {
        return "node [number=" + number + "]";
    }
    
}

约瑟夫环问题

你可能会说crazy,但我只想说EZ。

  • 具体问题 : 小朋友围成一圈,轮流报数,报到第n位的退出游戏,下一个小朋友继续从1开始报数,直到只剩下一个小朋友;

  • 问题的本质是一个环形链表,我们不断遍历,直到这个环形链表只有一个元素

  • 实现步骤

    1. 创建好一个环形链表

      • 构建一个表示链表头的first

      • 构建一个帮助我们的辅助节点cur

      • 最开始的时候,我们new一个节点,并把它给first和cur都附上值

      • cur现在代表我们正在构建的链表的第一个

      • 好的!,现在我们继续向里面增加节点

        1. 把节点连接到我们的环形链表上

        2. 让原来的老大让位,旧世界的余党该清除了!

        3. 这时候,我们的cur就派上用场了!

        4. cur.next = s

        5. S连接到头节点,形成闭环--s.next = first

        6. 现在s才是真正的第一,我cur要投奔你!

        7. cur = cur.next!

        8. 成功!恭喜我们!我们成功构建了一个环形链表

  1. 好啦!我们拥有了一个环形链表,现在我们就可以进行之前的游戏了

    1. 首先我们先想想,因为我们要删除一个小朋友,就得让他之前的那个node的下一个不再指向它,这很容易理解,因为他已经退出游戏了,所以!我们需要两个指针--一个用来找到我们要退出游戏的小朋友,另一个就在前一个指针的后面,准备把这个小朋友之前的那个节点的指向从要退出游戏的小朋友的身上移开!

      所以--我们定义一个front,就是代表我们环形链表的开头,根据之前的分析,我们还需要ige指向front之后一位的节点

      所以我们定义一个helper来帮助我们,我们先让他加入我们的队伍--helper = front ,为了让他在front的背后,我们选择用while遍历,直到helper.next = front 说明helper已经来到了front的后一个,目的实现了!

  1. 接着,准备工作完全完成,开始了游戏 。首先,我们要找到第一个开始的小朋友,因为不一定是从第一个小朋友开始的--这很ez

    我们只需用while循环,一个一个遍历即可

  2. 接着选出人淘汰,由于第一个小朋友就会报1,如果我们逢2淘汰的话,那么我们的指针大队只用移动一位就可以了,所以

    i = 0;i<count-1;i++

    找到了要淘汰的就开始行动 头指针先离开

    head = head.next

    然后让后面的节点连接到头指针的新位置

    cur .next = head;

  3. 如此重复,直到链表只剩下一个节点!;此时helper == first

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

约瑟夫环详解 的相关文章

  • Ant design vue 2.x 版本在 vue3 中的主题定制

    Ant design vue 2 x 版本在 vue3 中的主题定制 我们是在vue3 0 项目中使用 ant design vue 2 0 xff0c 解决流程和官网思路一致 xff0c 直接使用 less 变量层叠即可 xff0c 但是
  • vue3中provide和inject

    父子组件间数据通信 父组件 app vue import reactive provide ref watch from 39 vue 39 export default setup const userFlag 61 ref false
  • vue 视图更新不及时

    vue开发的过程中我们时常会遇到 数据更新和视图更新 不匹配的问题 简单点说就是vue没有监测到这一块儿的数据变化 简单的解决方法有几种 vue2 中 span class token comment 第一种 xff1a span span
  • 解决excle vba使用时vbe6ext.olb不能被加载 内存溢出问题

    版本 xff1a office 365 专业增强版 看到有复制文件以及修改注册表的方法 xff0c 都无法实现 如 xff1a 引用文章 里的方法无法解决我的问题 偶然发现只要用管理员权限打开excel就不会出现这个问题了
  • Python函数--numpy.fromfunction( )

    64 TOC 本以为fromfunction f a b 中传入f 的参数x和y分别是以左上角为原点的坐标 今天发现并非如此 x和y分别为一个shape为 xff08 a b xff09 的array 如下实验所示 xff1a span c
  • 内存中的swap机制

    目录 一 swap原理 二 swap内存回收的情况 三 NUMA架构下的Swap说明 四 回收策略 五 实验 六 总结 一 swap原理 把一块磁盘空间或者一个本地文件当成内存来使用 有换入和换出两个动作 换出 xff1a 把进程暂时不用的
  • FreeBSD源更换

    pkg 源 xff1a pkg源提供二进制安装包 FreeBSD中pkg源分为系统级和用户级两个源 不建议直接修改 etc pkg FreeBSD conf xff0c 因为该文件会随着基本系统的更新而发生改变 创建用户级源目录 xff1a
  • STM32 HAL_SYSTICK_Callback() 失效 无效

    64 TOC STM32 HAL SYSTICK Callback 失效 STM32 HAL SYSTICK Callback 失效 无效 未执行 在调试某块开发板时 xff0c 出现了HAL SYSTICK Callback 失效的情况
  • ubuntu使用管理员身份操作图形界面

    shell里面输入 span class token function sudo span nautilus ok 可视化进入文件夹 ctrl 43 h显示隐藏文件夹
  • 快速幂取模(C/C++)

    快速幂取模的思路 快速幂实现的最基本的理论就是我们离散课上或者数论中学过的一条公式推出的引理 引理 xff1a 积的取余等于取余的积的取余 再在这条引理的基础之上 xff0c 对指数型数据进行拆分以及合并 xff0c 从而得到我们用的快速幂
  • 5.Linux系统中解压缩详解

    文章目录 前言1 打包 归档 和压缩2 tar命令详解 xff08 打包和解包 xff09 3 tar命令详解 xff08 解压缩 xff09 4 zip命令详解5 unzip命令6 gzip命令7 gunzip命令8 bzip29 bun
  • 3.Shell位置变量和参数用法详解,位置参数变量作用,$,#,*,$1,$2等详解和例子

    位置变量 参数用法详解 位置参数变量作用 1 2等详解和例子 文章目录 前言位置参数变量作用例子 64 示例 和 64 的区别 总结友情链接 前言 位置变量 xff1a 在bash shell中内置的变量 在脚本代码中调用通过命令行传递给脚
  • 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧

    代码手写UI 这种方法经常被学院派的极客或者依赖多人合作的大型项目大规模使用 Geek们喜欢用代码构建UI xff0c 是因为代码是键盘敲出来的 xff0c 这样可以做到不开IB xff0c 手不离开键盘就完成工作 xff0c 可以专注于编
  • Python:if 语句的基本使用

    今天 xff0c 我们将学习Python中if语句的基本使用 if 在Python中用作某个条件或值的判断 xff0c 格式为 xff1a span class token keyword if span 条件 span class tok
  • Python模块介绍使用:zmail模块读取邮箱内邮件信息

    hello xff0c 大家好 xff0c 我是wangzirui32 xff0c 今天来教大家如何使用zmail模块读取邮箱内邮件信息 xff0c 开始学习吧 xff01 1 zmail安装 在命令行中输入以下命令即可安装 xff1a p
  • Python模块介绍使用:Python-Markdown解析Markdown文本

    博文作者 wangzirui32 x1f496 喜欢的可以 点赞 收藏 关注哦 x1f44f 我的第155篇原创作品 x1f449 本文首发于CSDN xff0c 未经许可禁止转载 x1f60e hello xff0c 大家好 xff0c
  • 【python学习】——字符串

    字符串 一 字符串的驻留机制 xff08 1 xff09 在python中它是基本数据类型 xff0c 是一个不可变的字符序列 xff08 2 xff09 字符串的驻留机制 xff1a 仅保存一份相同且不可变字符串的方法 xff0c 不用的
  • Linux安装部署SonarQube9.9 代码审查工具

    Linux安装部署SonarQube9 9 代码审查工具 1 SonarQube 简介 2 SonarQube安装与配置 2 1 官方软件包版本要求 2 2 基础环境配置 2 3 安装SonarQube 2 4 安装并配置PostgreSQ
  • 【数据库】Postgresql 与 MySQL 比较

    目录 Postgresql 与 MySQL 比较历史支持平台二者底层特性库存储引擎对数据的管理表连接算法 应用场景面向开发使用 Postgresql 与 MySQL 比较 二者都是比较强大的数据库 xff0c 选择使用哪一个数据库需要结合实
  • H5的离线缓存技术

    离线存储可以将站点的一些文件存储在本地 xff0c 它是浏览器自己的一种机制 xff0c 将需要的文件缓存下来 在没有网络的时候可以访问到缓存的对应的站点页面 xff0c 包括html xff0c js xff0c css xff0c im

随机推荐

  • QEMU虚拟机怎么配置网络才能主机和虚拟机都通

    当打开QEMU虚拟机配置界面的时候 xff0c 可以看到多种网络模型 而其中默认使用的是NAT xff0c 你会发现 xff0c 当你创建完虚拟机直接去配置网络之后 xff0c 网络是不通的 然后切换为其他模式之后 xff0c 你会发现 x
  • 虚拟机设置开机启动自动运行脚本

    首先设置虚拟机开机免密码自动启动 2 设置好开机免密码之后 xff0c 在配置开机自动启动脚本 编写一个bat文件作为脚本 xff0c 并将它放入到如下目录中 C ProgramData Microsoft Windows Start Me
  • QEMU虚拟机怎么配置网络

    当打开QEMU虚拟机配置界面的时候 xff0c 可以看到多种网络模型 而其中默认使用的是NAT xff0c 你会发现 xff0c 当你创建完虚拟机直接去配置网络之后 xff0c 网络是不通的 然后切换为其他模式之后 xff0c 你会发现 x
  • 关于VMware上的VAAI特性详解

    一般来说我们的存储在适配VMware的时候 xff0c 会牵涉搭配VAAI特性 xff0c 经常听到VAAI这到底是什么呢 xff1f VAAI的全称是VMware s Storage APIs for Array Integration
  • Python2.7版本安装报错

    python E S m sysconfig generate posix vars Could not find platform dependent libraries lt exec prefix gt Consider settin
  • oracle的安装(Oracle11G release2)

    一 xff1a 准备工作 1 关闭selinux 永久关闭 设置SELINUX 61 disabled xff1a vim etc selinux config 2 关闭firewalld 安装iptables systemctl stop
  • openstack kilo单击版本安装-最简单的安装方式

    由于K版本已经比较老了 xff0c 甚至连源都已经不怎么找得到了 xff0c 但是有时候为了一些特定的需求 xff0c 需要安装K版本 xff0c 这就比较麻烦 xff0c 本文找了一个较为简单的方法来安装 xff0c 并且是单机安装 准备
  • 本地显示远程服务器图形界面

    解决方案 序号方案简单区别方案一Xmanager1 VNC连接时及时突然中断 xff08 比如断网 xff09 xff0c 不影响操作进行 xff1b 2 不需要在服务器上装软件 xff0c 需要在你的电脑上装相应软件 xff0c 使用SS
  • SQL解析json(包含单层解析、多层解析)解析的数据可直接存到表中

    单层json解析 声明变量 declare 64 JsonData nvarchar max 61 39 34 BillName 34 34 12345765 34 34 SendDate 34 34 2022 11 10T00 00 00
  • MySQL查看当前使用的配置文件my.cnf的方法

    MySQL查看当前使用的配置文件my cnf的方法 MySQL实例在启动时 xff0c 会先读取配置参数文件my cnf my cnf一般会放在MySQL的安装目录中 xff0c 用户也可以放在其他目录加载 安装MySQL后 xff0c 系
  • Latex 之 微分符号d的竖立表达 {\rm d}

    微分符号d竖立表达 rm d
  • Abaqus 导出XYdata的几种方式

    目录 方法一 xff1a 通过Plu ins gt Tools gt Excel Utilities xff0c 将XY Data直接到Excel文件里 xff01 方式二 xff1a Report gt XY xff0c 导出默认 rpt
  • ABAQUS 显示应力/应变场的最大/最小值

    如下图所示 xff0c 可以显示最大最小值 具体数据导出 xff1a Report gt Field Output 导出结果 场输出 xff08 Field output xff09 同一时刻 xff0c 不同位置 xff1b 历史输出 H
  • mac下重装系统,应用程序副本已损坏 的解决办法

    首先需要确定电脑的年份和对应的系统 xff0c 简单的道理是老的电脑硬件是不适配最新系统的 xff0c 我需要安装的是10 12的系统 系统来源 xff1a 黑苹果 年份确定 xff1a 2017年9月之前生产的电脑 我用的是U盘安装的方法
  • mysql查看数据库的容量及表容量

    select table schema sum DATA LENGTH 43 sum INDEX LENGTH from information schema tables group by table schema 在需要备份数据库里面的
  • 【数据结构-栈】借助栈实现回文的判断

    数据结构 栈 借助栈实现回文的判断 最近在学习栈 xff0c 尝试用C实现了一些功能 include lt stdio h gt include lt stdlib h gt typedef struct app char date str
  • C语言实现冒泡排序

    冒泡排序作为学习排序最基本的算法 xff0c 具有稳定性与实用性 下面是C语言冒泡排序的源代码 include lt stdio h gt int main void int a 10 61 6 4 3 2 7 8 9 10 1 5 int
  • C语言实现快速排序算法

    快排作为公认最优秀的排序方法 xff0c 是每一个程序员都应该掌握的 xff0c 那么 xff0c 今天就由我来为大家简单讲解一下快速排序算法的代码 源代码如下 xff1a include lt stdio h gt void quicks
  • C语言实现二分查找

    相较于线性查找 xff0c 二分查找在面对大量数据时的效率更高 xff0c 但它的缺点是只能对有序数组进行查找 源代码如下 xff1a include lt stdio h gt void binarysearch int a int su
  • 约瑟夫环详解

    package newjosephu public class myfinaljosephu 你可能会说crazy 我只想说ez xff01 public static void main String args circlelinkedl