约瑟夫环的三种解法(循环链表、数组和用数组模拟链表)

news2024/11/17 17:29:32

目录

前言

一、用循环链表实现

二、用数组实现

三、用数组模拟链表实现



前言

题目描述

编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数,报到 m 的人离开。

下一个人继续从 1 开始报数。

n-1 轮结束以后,只剩下一个人,问最后留下的这个人编号是多少?

数据范围:​

进阶:空间复杂度 O(1),时间复杂度 O(n)

示例 1

输入:5,2    

返回值:3    

说明:

开始5个人 1,2,3,4,5 ,从1开始报数,1->1,2->2编号为2的人离开

1,3,4,5,从3开始报数,3->1,4->2编号为4的人离开

1,3,5,从5开始报数,5->1,1->2编号为1的人离开

3,5,从3开始报数,3->1,5->2编号为5的人离开

最后留下人的编号是3      

示例 2

输入:1,1

返回值:1

一、用循环链表实现

typedef struct Node
{
    int id;  // 编号(从 1 开始)
    struct Node* next;
}Node;

int ysf(int n, int m) 
{
    // 采用尾插法构造编号为 1 ~ n 的循环链表
    Node* phead = (Node*)malloc(sizeof(Node));  // 头指针
    phead->id = 1;
    Node* tail = phead;  // 尾指针
    for (int i = 2; i <= n; ++i)
    {
        Node* newnode = (Node*)malloc(sizeof(Node));
        newnode->id = i;
        newnode->next = NULL;
        tail->next = newnode;
        tail = newnode;
    }
    tail->next = phead;  // 让最后一个节点的 next 域指向第一个节点
    // 开始
    Node* cur = phead;
    Node* prev = tail;
    int count = 1;  // 计数器
    while (cur != prev)
    {
        if (count == m)
        {
            prev->next = cur->next;
            free(cur);
            cur = prev->next;
            count = 1;  // 重置为 1
        }
        else 
        {
            prev = cur;
            cur = cur->next;
            ++count;
        }
    }
    int ret = cur->id;
    free(cur);
    return ret;
}

 

二、用数组实现

int ysf(int n, int m)
{
    int* is_out = (int*)calloc(n, sizeof(int));  // 0 表示在圈内,1 则表示退出
    int number = n;
    int count = 1;  // 计数器
    int i = 0;
    while (number > 1)
    {
        if (is_out[i] == 0)  // 圈内的人报数
        {
            if (count == m)
            {
                is_out[i] = 1;  // 退出
                --number;
                count = 1;  // 重置为 1
            }
            else
            {
                ++count;
            }
        }
        // 法一:
        ++i;
        if (i >= n)
        {
            i = 0;
        }
        // 法二:
        // i = (i + 1) % n;
    }
    for (i = 0; i < n; ++i)
    {
        if (is_out[i] == 0)
        {
            break;
        }
    }
    free(is_out);  // 释放动态开辟的内存空间
    return i + 1;  // 返回编号
}

 

三、用数组模拟链表实现

int ysf(int n, int m)
{
    int* next = (int*)calloc(n, sizeof(int));
    for (int i = 0; i < n - 1; ++i)
    {
        next[i] = i + 1;
    }
    // next[n - 1] == 0
    int cur = 0;
    int prev = n - 1;
    int count = 1;  // 计数器
    while (cur != prev)
    {
        if (count == m)
        {
            next[prev] = next[cur];
            next[cur] = -1;  // 退出
            cur = next[prev];
            count = 1;  // 重置为 1
        }
        else
        {
            prev = cur;
            cur = next[cur];
            ++count;
        }
    }
    free(next);  // 释放动态开辟的内存空间
    return cur + 1;  // 返回编号
}

创作不易,可以点点赞,如果能关注一下博主就更好了~ 

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

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

相关文章

dockerfile传参问题和权限问题

dockerfile传参问题和权限问题 一、docker传参 在工作中&#xff0c;使用dockerfile构建镜像的时候&#xff0c;随着业务越来越多&#xff0c;流水线也越来越多&#xff0c;这时候就需要构建一些通用流水线&#xff0c;而通用流水线最大的问题&#xff0c;就是需要传递参数&a…

Linux基础命令和程序部署

Linux基础命令 ls 可以查看当前目录内容ls 后面跟上一个具体路径可以查看指定目录内容ls -l 可以以列表的形式查看&#xff0c;缩写llpwd 查看当前目录的绝对路径cd 切换目录&#xff08;就是window界面的鼠标双击目录进入动作&#xff09;&#xff0c;cd在切换目录时后面可以…

【教学类-34-05】拼图(彩色图片+圆角凹凸拼图)3*4格子(中班主题《个别化拼图》偏美术)

图片展示&#xff1a; 背景需求&#xff1a; 最近班级孩子得了传染病&#xff0c;来了2位孩子。 我觉得&#xff1a;人少的话&#xff0c;孩子们就有充足的时间去拼那些带有凹凸槽的自制彩色图形拼图。 难点&#xff1a; 1、从直线剪切&#xff08;方形拼图&#xff09;转…

Flink Join操作

目录 DataStream API&#xff08;函数编程&#xff09; window Join join coGroup interval Join Table API&#xff08;flink sql) Reguler Join (常规join) inner join left join / right join full join interval join lookup join Window Join INNER/LEFT/RIG…

摄像头录像软件哪款好用?这款就很不错

案例&#xff1a;录屏时怎么录电脑摄像头&#xff1f; 【很多时候我不仅仅需要录制电脑屏幕&#xff0c;还需要在录屏时录入人像&#xff0c;可是我的录屏软件不支持录制人脸。有没有好用的电脑录屏带人脸的屏幕录制工具介绍&#xff1f;】 无论是教学、游戏直播、软件开发、…

HTML + CSS + JS 利用邮编查询 API 实现邮编查询工具

引言 邮政编码是地址信息的重要组成部分&#xff0c;可以帮助快递公司、物流公司等对地址进行快速、准确的识别和派送。因此&#xff0c;邮编查询工具应用在许多业务场景中都有广泛的应用&#xff0c;例如&#xff1a;电商平台、物流公司、金融机构等。通过使用邮编查询 API&a…

fiddler在请求头添加指定信息

下图所示&#xff0c;设置完请求头信息后&#xff0c;点击右上角Actions按钮的Run Filterset now保存信息&#xff0c;即可。

centos7部署FastDFS服务

一、安装需要的相关依赖 yum -y install make cmake gcc gcc-c 因为我的服务器已经安装了gcc&#xff0c;所以略去 使用gcc -v查看版本 yum -y install zip unzip 安装性能事件通知库 yum -y install libevent 安装nginx依赖 yum -y install libevent yum -y install zli…

MITA触摸屏维修WP4053米塔工控机控制屏维修

MITA-TEKNIK米塔触摸屏维修工控机工控屏控制器维修DISPLAY 2COM全系列型号 Mita-Teknik触摸屏维修常见故障&#xff1a;上电无显示&#xff0c;运行报故障&#xff0c;无法与电脑通讯&#xff0c;触摸无反应&#xff0c;触控板破裂&#xff0c;触摸玻璃&#xff0c;上电黑屏&a…

自动化工具 接口自动化测试引擎

一、前言&#xff1a; 1、解决痛点&#xff1a;接口自动化测试用例需要人去开发、去维护。 2、实现第一性原理&#xff1a;根据定义的测试策略自动生成接口测试用例。 二、引擎优势&#xff1a; 1、提升人效&#xff1a;降低传统方式中接口测试开发与维护的工作量。 2、覆盖更…

输电线路在线监拍设备的国网协议对接方案

疫情过后&#xff0c;尤其山东淄博电力建设的发展&#xff0c;电网规模的不断研发&#xff0c;高压远距离架空输电线路日益增多&#xff0c;在复杂地形条件下的电网建设和设备维护工作也越来越多。 如何解决4G模块控制的功耗&#xff0c;和信号传输方面有一套完整的方案。基于合…

【网络安全】红队基础免杀

引言 本文主要介绍“反射型 dll 注入”及“柔性加载”技术。 反射型 dll 注入 为什么需要反射型 dll 注入 常规的 dll 注入代码如下&#xff1a; int main(int argc, char *argv[]) {HANDLE processHandle;PVOID remoteBuffer;wchar_t dllPath[] TEXT("C:\\experime…

从源码全面解析LinkedBlockingQueue的来龙去脉

一、引言 并发编程在互联网技术使用如此广泛&#xff0c;几乎所有的后端技术面试官都要在并发编程的使用和原理方面对小伙伴们进行 360 的刁难。 二、使用 对于阻塞队列&#xff0c;想必大家应该都不陌生&#xff0c;我们这里简单的介绍一下&#xff0c;对于 Java 里面的阻塞…

【 SpringBoot 统⼀功能处理 】

文章目录 引言一、⽤户登录权限效验Spring 拦截器拦截器实现原理扩展&#xff1a;统⼀访问前缀添加 二、统⼀异常处理三、统⼀数据返回格式四、ControllerAdvice 源码分析 引言 接下来是 Spring Boot 统⼀功能处理模块&#xff0c;是 AOP 的实战环节&#xff0c;要实现的课程⽬…

轨道交通信号系统的可靠性与安全性

01.引言 城市轨道交通系统作为大容量公共交通工具&#xff0c;其安全性直接关系到广大乘客的生命安全&#xff0c;所以要求城市轨道交通系统在如此高的运行密度下&#xff0c;还要保证安全和高效率的运行。而信号系统作为保证列车安全、正点、便捷、舒适、高密度不间断运行的重…

Filter 过滤器基本内容及案例改进

举个例子 假设在Web资源中&#xff0c;A资源要写5行代码&#xff0c;而B资源也要写一模一样的5行代码&#xff0c;这时就把这些代码都提取出来&#xff0c; 在过滤器里写这些代码&#xff0c;因为访问任何资源都要经过过滤器&#xff0c;在过滤器走一遍就可以&#xff0c;而不用…

性能优化之20个 Linux 服务器性能调优技巧

Linux是一种开源操作系统&#xff0c;它支持各种硬件平台&#xff0c;Linux服务器全球知名&#xff0c;它和Windows之间最主要的差异在于&#xff0c;Linux服务器默认情况下一般不提供GUI(图形用户界面)&#xff0c;而是命令行界面&#xff0c;它的主要目的是高效处理非交互式进…

【22】核心易中期刊推荐——人工智能与识别图像处理与应用

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

网络编程代码实例:多进程版

文章目录 前言代码仓库内容代码&#xff08;有详细注释&#xff09;server.cclient.cMakefile 结果总结参考资料作者的话 前言 网络编程代码实例&#xff1a;多进程版。 代码仓库 yezhening/Environment-and-network-programming-examples: 环境和网络编程实例 (github.com)E…

商品如果要在美国商超出售,那么如何申请美国条形码呢?

美国条码注册是指向美国条码协会提出条码申请&#xff0c;通过条码协会的审核批准后&#xff0c;条码可以印在产品上使用。条码是进入各大商场&#xff0c;超市的身份证&#xff0c;企业有条形码&#xff0c;一是可以提高企业产品的知名度&#xff1b;二是增加产品的防伪力度&a…