数据结构与算法之约瑟夫问题求解

news2024/11/20 8:33:20

N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个人,其余人都被杀掉。例如N=6,M=5,被杀掉的顺序是:5、4、6、2、3、1。

问最后留下的人是谁?

分析:

如N=6,M=5,最后留下的人就是1

第一轮:1 2 3 4 5 =》5出局

第二轮:6 1 2 3 4 =》 4出局

第三轮:6 1 2 3 6 =》6出局

第四轮: 1 2 3 1 2 =》 2出局

第五轮: 3 1 3 1 3 =》 3出局

最后留下的是1

解题思路:

1、创建一个长度为n的循环链表

2、将指针指向尾部结点

3、判断不是只剩一个结点,则循环报数,报到指定的第M个数的前一个,然后将第M个数的结点删除(curr.next = curr.next.next),直到剩余最后一个结点,退出循环。

4、返回最后剩余的人

package com.algorithm.josephus;

public class JosephusLinkedList {
    ListNode head;
    /**
     * 链表的结点数量
     */
    int size;

    /**
     * 构建结点
     */
    class ListNode {
        int value;
        ListNode next;
        ListNode(int value) {
            this.value = value;
            this.next = null;
        }
    }
    //构建建循环链表,n为总人数
    private void createLoopLinkList(int n) {
        for (int i = 1; i <= n; i++) {
            insertTail(i);
        }
    }
    private void insertTail(int value) {
        ListNode newNode = new ListNode(value);
        ListNode curr = head;
        if (curr == null) {
            head = new ListNode(value);
        } else {
            while (curr.next != null) {
                curr = curr.next;
            }
            curr.next = newNode;
            if (size == 5) {
               //尾结点指向头结点,形成环
                newNode.next = head;
            }
        }
        size++;
    }
    /**
     * 约瑟夫问题求解
     * @return 返回最后留下的人
     */
    private int solveJosephusCircle() {
        ListNode curr = head;
        if (size == 0) {
            System.out.println("约瑟夫环为空,不进行求解");
            return 0;
        }
        int m = 5;
        int count = 1;
        //使curr指针指向尾部结点,此处是关键点,如果未指向末尾结点,报数时会从第二个开始报数了
        while (curr.next != head) {
            curr = curr.next;
        }
        while (curr.next != curr) {
            System.out.print("第" + count + "轮报数:");
            for ( int i = 0; i < m - 1; i++) {
                curr = curr.next;
                System.out.print(curr.value + " ");
            }
            System.out.println(curr.next.value);
            System.out.println(curr.next.value + "出局了");
            //删除出局的结点
            curr.next = curr.next.next;
            size--;
            count++;
        }
        return curr.value;
    }

    public static void main(String[] args) {
        JosephusLinkedList josephusLinkedList = new JosephusLinkedList();
        int n = 6;
       //创建约瑟夫环
        josephusLinkedList.createLoopLinkList(n);
        System.out.println("开始报数:");
        int lastOne = josephusLinkedList.solveJosephusCircle();
        System.out.println("最后留下的人是:" + lastOne);
    }
}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1358435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Path的使用】Node.js中的使用Path模块操作文件路径

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;Node.js &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续前进的勇…

2个nodejs进程利用redis 实现订阅发布

1.新建文件 redis_db.js use strict;const redis require(redis); const options {host: "127.0.0.1",port: 6379,password: "123456", // CONFIG SET requirepass "123456" }var array [] for(var i0; i<3; i){const client redis.crea…

期货日数据维护与使用_日数据维护_sqlite3数据库创建

目录 写在前面&#xff1a; 初始准备 开始编写数据库代码 t_product t_symbol_basemsg t_main_symbol t_online_symbol t_last30_daily 小贴士 写在前面&#xff1a; 本文默认已经创建了项目&#xff0c;如果不知道如何创建一个空项目的&#xff0c;请参看以下两篇博…

LLM Agent之再谈RAG的召回多样性优化

1. Query多样性 2019 Query Expansion Techniques for Information Retrieval: a Survey 传统搜索Query的扩展&#xff0c;有基于用户搜索日志挖掘的相似Query&#xff0c;有基于相同召回文档关联的相似Query&#xff0c;也有基于SMT的Query改写方案。那和大模型时代更搭配的自…

防蓝光护眼台灯哪个牌子好?2024护眼灯315合格产品

最近身边的宝妈们都来问我这个已有两个娃的老司机&#xff0c;刚上小学就是近视了&#xff0c;买什么台灯给家里孩子能保护视力&#xff0c;经过小学门口时&#xff0c;真的是戴眼镜的小朋友占多数&#xff0c;搜索了我国的近视数据&#xff0c;中国的人口有14亿人左右&#xf…

个人调用OCR

一、自己训练模型 二、调用现成API 此处介绍百度智能云API&#xff0c;因为有免费次数。&#xff08;原来一些网址在百度不是默认显示网址的&#xff0c;而是自己的网站名字&#xff09; 首页找到OCR 每个人每月能用1K次。&#xff08;有详细的API文档说明&#xff0c;不过跟…

爱了!水浸监测这个技术,看了都说好!

在当今社会&#xff0c;水浸事件可能对各类场所和设施造成严重的损害&#xff0c;从而威胁到财产安全和业务持续性。 水浸监控系统不仅仅是一种技术手段&#xff0c;更是对于防范水灾的一项战略性解决方案。水浸监控系统实时了解局势并采取迅速而有效的措施&#xff0c;从而最大…

STM32 CubeMX产生的程序架构

使用STM32CubeMX产生启动相关代码&#xff0c;配置各种外设。在后续程序开发过程中&#xff0c;有可能使用STM32CubeMX逐步产生使用的代码&#xff0c;为了将其产生的代码和我们程序隔离&#xff0c;一种可行的程序架构如下&#xff1a; 在此架构中&#xff0c;STM32CubeMX产生…

消化性溃疡与胃肠道微生物群

谷禾健康 据柳叶刀统计&#xff0c;消化性溃疡(PUD)每年影响全球400万人&#xff0c;据估计普通人群终生患病率为5−10%(Lanas A et al., 2017)。尽管消化性溃疡的全球患病率在过去几十年中有所下降&#xff0c;但其并发症的发生率却保持不变。 消化性溃疡是指胃或十二指肠黏膜…

Color Control

设计一个优秀的用户界面是一项艰巨的任务。特别是如果你想改变UI的颜色,调整所有元素可能需要花费大量时间。Color Control可以帮助你!在检查器中以可视化的方式将你的项目颜色定义为资源。Color Control为你提供了组件,当你编辑它们时,它们会自动更新你的UI元素。 颜色控制…

nodejs发送消息给钉钉机器人

1.钉钉添加机器人 1.1 新建一个群 --> 群设置 --> 机器人 1.2 机器人管理 --> 添加机器人 1.3 机器人--> 自定义-->添加 1.4 配置信息 备注1&#xff1a;密钥复制出来SEC2c689174c4a8ed49c8a7309a490cd98e0e7f7bc788bb7232d53c738eb5f5d008 备注2&#xff1a;…

OpenHarmony内存泄漏指南 - 解决问题(综合)

本系列文章旨在提供定位与解决OpenHarmony应用与子系统内存泄露的常见手段与思路&#xff0c;将会分成几个部分来讲解。首先我们需要掌握发现内存泄漏问题的工具与方法&#xff0c;以及判断是否可能存在泄漏。接着需要掌握定位泄漏问题的工具&#xff0c;以及抓取trace、分析tr…

肠道炎症与年龄和阿尔茨海默病病理学相关:一项人类队列研究

谷禾健康 ​阿尔茨海默 研究表明&#xff0c;慢性低水平的炎症&#xff08;“炎症衰老”&#xff09;可能是年龄相关疾病的一个介导因素&#xff0c;而肠道微生物通过破坏肠道屏障可能会促进炎症。 虽然老化和阿尔茨海默病&#xff08;AD&#xff09;与肠道微生物群组成的改变有…

Android linphone-android sdk设置语音编码问题

1.遇到的问题 今天遇到linphone-android sdk需要解决语音编码问题&#xff0c;需要指定编码。查了下配置&#xff0c;里面没有发现类似的配置。 ## Start of factory rc # This file shall not contain path referencing package name, in order to be portable when app is r…

逻辑回归简单案例分析--鸢尾花数据集

文章目录 1. IRIS数据集介绍2. 具体步骤2.1 手动将数据转化为numpy矩阵2.1.1 从csv文件数据构建Numpy数据2.1.2 模型的搭建与训练2.1.3 分类器评估2.1.4 分类器的分类报告总结2.1.5 用交叉验证&#xff08;Cross Validation&#xff09;来验证分类器性能2.1.6 完整代码&#xf…

web动态月球特效

文章目录 效果预览文件分布代码 效果预览 文件分布 代码 鼠标点击特效 fireworks.js class Circle {constructor({ origin, speed, color, angle, context }) {this.origin originthis.position { ...this.origin }this.color colorthis.speed speedthis.angle anglethi…

OpenSSL——升级

OpenSSL&#xff08;Open Secure Sockets Layer&#xff09;是一个开源的软件库&#xff0c;提供了SSL和TLS协议的实现&#xff0c;用于加密通信。它广泛用于安全连接&#xff0c;例如在网站上通过HTTPS协议进行安全的数据传输. 但是从openssl申请道德证书是不安全的。对于网站…

再次拓宽信创生态版图,思迈特与统信软件完成产品兼容适配认证

近日&#xff0c;思迈特软件与统信软件科技有限公司&#xff08;简称“统信软件”&#xff09;完成产品兼容性适配互认证&#xff0c;加速国产信创生态化建设进程。 本次测试由商业智能与数据分析软件&#xff08;简称&#xff1a;Smartbi Insight V11&#xff09;产品与统信服…

safari缓存清理

safari缓存清理 点击顶端Safari浏览器–>点击偏好设置 点击隐私–>管理网站数据 全部移除