约瑟夫环详解

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(使用前将#替换为@)

约瑟夫环详解 的相关文章

  • iptables原理和防火墙主要命令使用场景

    https www zsythink net archives 1764 朱双印的个人日志 xff0c 写的非常的通俗易懂 xff0c 好文章 https blog csdn net u011277123 article details 8
  • 链路mtu

    常常见到交换机和网卡说明中提到支持Jumbo Frame xff0c 但我一直对以太网的Jumbo Frame xff08 巨帧 xff09 如何使用不太理解 xff0c 今日在网上找到2则现摘录下来 xff0c 相信看了以后大家会有收获
  • eggjs

    https editor csdn net md not checkout 61 1 amp spm 61 1001 2014 3001 4503 https blog csdn net weixin 42304193 article de
  • mini6410上HelloQt4运行出现libQtGui.so.4: cannot open shared的原因

    主要原因是在3 3 3节中 xff0c 编写的环境变量搭建文件setqt4env中设置路径不对 export LD LIBRARY PATH 61 xff08 看看有没有文件中的目录 xff09 应该改成你所在的qt4 7目录中的lib目录
  • VINS技术路线与代码详解

    VINS技术路线 写在前面 xff1a 本文整和自己的思路 xff0c 希望对学习VINS或者VIO的同学有所帮助 xff0c 如果你觉得文章写的对你的理解有一点帮助 xff0c 可以推荐给周围的小伙伴们 xff0c 当然 xff0c 如果
  • 用MicroPython开发ESP32- 用Thonny写程序

    陈拓 2022 06 11 2022 06 12 1 简介 在 用MicroPython开发ESP32 固件烧写与测试 https zhuanlan zhihu com p 527291091 https blog csdn net che
  • 单片机 stm32 接收数据和处理

    背景 1 单片机串口接收数据处理 xff0c 这个代码已经过很多项目验证 xff0c 没有问题 用这个代码帮了好几个同事解决数据接收久了就异常 2 这个代码做到接收和处理分开 避免不必要的处理逻辑问题 3 也可用于网口tcp xff0c u
  • odroid Xu4介绍

    Odroid xu4介绍 下面对这块开发板做一下简单的介绍 xff0c 共需要用到的人参考 从参数上来看 xff0c ODROID XU4的整体性能基本和目前的中端智能手机差不多 xff0c 它搭载了主频
  • OdroidXu4开发环境搭建

    OdroidXu4开发环境搭建 一 烧录镜像 1 SD卡烧录 首先准备一张至少16G的sd卡 镜像可以在官网 xff1a http odroid com dokuwiki doku php id 61 en odroid xu4 softw
  • 大小端:字节序与比特序

    https blog csdn net fzy0201 article details 26876711 https blog csdn net qq 40334837 article details 89042607 前言 前两天被问到一
  • VLC Buffering机制介绍

    一 简介 了解一定播放器知识的同学应该都知道 xff0c 播放器内部是有缓存的 xff08 非直播场景 xff09 缓存的作用主要是解决生产者和消费者速度的不匹配 xff0c 给用户更好的使用体验 例如 xff0c 在网络不稳定的情况下 x
  • Linux静态库和动态库学习总结

    一 废话 之前由于工作需要 xff0c 要封装一个Linux加密解密转换的动态库 xff0c 这个之前只做过Windows下面的 xff0c Linux下面还真没有做过 xff0c 之后做了整一个晚上才算做好 xff0c 不过其中也学到了不
  • UART的FIFO功能

    经常听到UART的FIFO功能 xff0c 但是从来没有真正使用过和认真思考过它的作用 正好有客户用到这个功能 xff0c 在这里做个总结 FIFO 是 First In First Out 的缩写 xff0c 它是一个具有先入先出特点的缓
  • 《C语言内核深度解析》笔记(3):指针才是C语言的精髓

    第03章 指针才是C语言的精髓 3 2 指针 int a 61 10 int p 61 amp a 指针变量p和普通变量之间没有本质区别 xff0c 都是变量空间放了一个数值 xff0c 只是p里面的数值比较特殊 xff0c 是a空间的地址
  • 相机针孔模型----从世界坐标系,到相机坐标系,再到图像物理坐标系,最后到图像像素坐标系的转换过程解析

    看了很多讲解针孔相机模型中从世界坐标系 gt 到相机坐标系 gt 图像坐标系的文章 xff0c 心里的疑惑也逐渐展开 xff0c 现在总结一下自己的理解 xff1a 世界坐标系 相机坐标系 图像物理坐标系 图像像素坐标系在我的另一篇博文里已
  • D1 R32 – ESP32+Arduino CNC Shield控制步进电机

    陈拓 2023 04 01 2023 04 05 1 简介 在 Arduino Uno开发板 43 电机驱动扩展版CNC Shield V3 0硬件说明 https blog csdn net chentuo2000 article det
  • pixhawk当中关于NMEA类型的gps数据处理流程

    1 启动跟新gps的数据的任务是在ArduCopter cpp中scheduler tasks中 调用的速度是50hz 2 通过执行update GPS方法中的 3 调转到ap gps cpp中的update方法中 4 在update中通过
  • C++Eigen库的配置和基本使用

    1 配置 1 下载 http bitbucket org eigen eigen get 3 2 5 tar bz2 2 配置 文件夹名字较长 xff0c 解压后可重命名 xff0c 如我命名为eigen3 xff0c 把D program
  • C++:extern "c"用法解析

    引言 C 43 43 保留了一部分过程式语言的特点 xff0c 因而它可以定义不属于任何类的全局变量和函数 但是 xff0c C 43 43 毕竟是一种面向对象的程序设计语言 xff0c 为了支持函数的重载 xff0c C 43 43 对全
  • 堆栈的作用,以及存放的数据

    在计算机领域 xff0c 堆栈是一个不容忽视的概念 xff0c 但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构 堆栈都是一种数据项按序排列的数据结构 xff0c 只能在一端 称为栈顶 top 对数据项进行插入和删除 要点 x

随机推荐