华为OD机试 - 报数问题 - 约瑟夫环(Python/JS/C/C++ 2024 E卷 100分)

news2024/9/19 7:31:49

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

有n个人围成一圈,顺序排号为1~n。

从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

二、输入描述

输入人数n(n < 1000)

三、输出描述

输出最后留下的是原来第几号

四、测试用例

测试用例1:

1、输入

2

2、输出

2

3、说明

报数序号为1的人最终报3,因此序号1的人退出圈子,最后剩下序号为2的那位

测试用例2:

1、输入

5

2、输出

4

3、说明

按照上述规则,最后剩下的人的编号为 4。

五、解题思路

1、约瑟夫环

这个问题是经典的“约瑟夫环”问题。在这个问题中,n 个人站成一圈,每个人按照顺序报数,报到 3 的人退出圈子,直到只剩下一个人为止。要解决这个问题,我们可以使用数组或链表模拟这个过程,也可以使用数学方法直接找到最后剩下的人的位置。

核心算法是从第一个人开始,顺序报数。每次移除报数到 3 的人,然后继续报数。通过一个索引变量和模运算来模拟环形的报数过程。

模运算处理循环:index = (index + 2) % size 的模运算用于处理圆圈结构,使得报数可以循环进行,即在列表末尾后又从头开始。

2、具体步骤

  1. 初始化圈子:将 n 个人的编号加入到一个数据结构中,形成一个环形队列,方便按照顺序报数和移除元素。
  2. 模拟报数过程:
    • 从第一个人开始报数,每数到 3 的人退出圈子。
    • 移除报数到 3 的人后,继续从下一个人开始报数,直到只剩下一个人。
    • 我们使用一个索引变量来记录当前报数的位置,利用模运算 (%) 来处理环形报数。
  3. 输出结果:循环结束后,列表中只剩下一个人,输出该人的编号。

3、时间复杂度

每次移除一个人,最多需要花费 O(n) 的时间,因为在最坏情况下需要遍历整个列表(比如在使用数组或链表时需要寻找并移除第 k 个元素)。

总共需要进行 n-1 次移除操作,因此时间复杂度是 O(n * n) = O(n^2)。

4、空间复杂度

O(n),因为需要存储 n 个人的编号。所有算法和数据结构(列表、链表)都需要占用线性空间来存储这些元素。

六、Python算法源码

def find_last_person(n):
    # 初始化圈子,将1到n编号加入列表
    circle = list(range(1, n + 1))

    index = 0  # 当前报数的位置

    # 模拟报数过程,直到只剩一个人
    while len(circle) > 1:
        # 找到要移除的人的位置,报数到3的人退出
        index = (index + 2) % len(circle)  # +2 是因为要报到3(报数从0开始计数)
        circle.pop(index)

    # 返回最后剩下的人的编号
    return circle[0]

if __name__ == "__main__":
    n = int(input())  # 输入人数
    last_person = find_last_person(n)
    print(last_person)

七、JavaScript算法源码

function findLastPerson(n) {
    // 初始化圈子,将1到n编号加入数组
    let circle = [];
    for (let i = 1; i <= n; i++) {
        circle.push(i);
    }

    let index = 0;  // 当前报数的位置

    // 模拟报数过程,直到只剩一个人
    while (circle.length > 1) {
        // 找到要移除的人的位置,报数到3的人退出
        index = (index + 2) % circle.length;  // +2 是因为要报到3(报数从0开始计数)
        circle.splice(index, 1);
    }

    // 返回最后剩下的人的编号
    return circle[0];
}

// 输入人数
let n = parseInt(prompt("请输入人数:"));
let lastPerson = findLastPerson(n);
console.log(lastPerson);

八、C算法源码

#include <stdio.h>

int findLastPerson(int n) {
    int circle[1000];  // 初始化圈子数组
    int size = n;      // 当前圈子中人数

    // 初始化圈子,将1到n编号加入数组
    for (int i = 0; i < n; i++) {
        circle[i] = i + 1;
    }

    int index = 0;  // 当前报数的位置

    // 模拟报数过程,直到只剩一个人
    while (size > 1) {
        // 找到要移除的人的位置,报数到3的人退出
        index = (index + 2) % size;  // +2 是因为要报到3(报数从0开始计数)

        // 移除报数为3的人,将后面的元素前移
        for (int i = index; i < size - 1; i++) {
            circle[i] = circle[i + 1];
        }
        size--;  // 减少圈子中人数
    }

    // 返回最后剩下的人的编号
    return circle[0];
}

int main() {
    int n;
    printf("请输入人数: ");
    scanf("%d", &n);  // 输入人数

    int lastPerson = findLastPerson(n);
    printf("%d\n", lastPerson);

    return 0;
}

九、C++算法源码

#include <iostream>
#include <list>

using namespace std;

int findLastPerson(int n) {
    list<int> circle;

    // 初始化圈子,将1到n编号加入列表
    for (int i = 1; i <= n; i++) {
        circle.push_back(i);
    }

    auto it = circle.begin();  // 当前报数的位置

    // 模拟报数过程,直到只剩一个人
    while (circle.size() > 1) {
        // 找到要移除的人的位置,报数到3的人退出
        for (int count = 0; count < 2; count++) {  // +2 是因为要报到3
            it++;
            if (it == circle.end()) {
                it = circle.begin();  // 循环到列表开头
            }
        }
        it = circle.erase(it);  // 移除当前报数为3的人
        if (it == circle.end()) {
            it = circle.begin();  // 如果到达列表末尾,循环到开头
        }
    }

    // 返回最后剩下的人的编号
    return circle.front();
}

int main() {
    int n;
    cout << "请输入人数: ";
    cin >> n;  // 输入人数

    int lastPerson = findLastPerson(n);
    cout << lastPerson << endl;

    return 0;
}


🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

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

相关文章

浸没边界法精度相关的论文的阅读笔记

Convergence proof of the velocity field for a stokes flow immersed boundary method https://doi.org/10.1002/cpa.20233 研究对象的选取 他这里为什么能够选取一个周期性边界的流场啊&#xff1f;为什么不是狄利克雷边界或者诺伊曼边界&#xff1f; 方形流场的边界值 …

keil里sprintf的用法

代码&#xff1a; #include<stdio.h> int main(void) {float i-123.45;char zifu[10];sprintf(zifu,"%f",i);while(1);return 0; } 仿真结果 代码&#xff1a; #include<stdio.h> int main(void) {float i123.45;char zifu[10];sprintf(zifu,"%f…

ReKep——李飞飞团队提出的新一代机器人操作方法:基于视觉语言模型和关键点约束

前言 由于工厂、车厂的任务需求场景非常明确&#xff0c;加之自今年年初以来&#xff0c;我司在机器人这个方向的持续大力度投入(包括南京、长沙两地机器人开发团队的先后组建)&#xff0c;使得近期我司七月接到了不少来自车厂/工厂的订单&#xff0c;比如柔性上料、物料分拣、…

Linux嵌入式相机 — 项目总结

main函数执行流程 1、初始化触摸屏 Touch_screen_Init();struct tsdev *ts NULL; ts ts_setup(NULL, 0); //以阻塞打开2、初始化 LCD LCD_Init(void); 通过 ioctl 函数获取 LCD 的固定参数、可变参数&#xff0c;得到分辨率、bpp、一行的长度&#xff08;以字节为单位&a…

如何创建和编辑抖音百科词条,不会的找我们代创建!

如何创建和编辑抖音百科词条&#xff0c;不会的找我们代创建&#xff01; 如何创建抖音百科个人词条&#xff0c;个人抖音百科的创建 #抖音百科 #百科 #推广 做过百度百科的老板们注意了&#xff0c;等一下别划走。 2024 年品宣新风口出现了&#xff0c;抖音百科正在替代百度…

Unity Behavior Designe 可视化有限状态机(Composites篇)

对有限状态机这一个概念你可以看看这两篇文章&#xff1a; Unity 一个比较适合学习的FSM状态机(汉化和功能简述)-CSDN博客 C# x Unity面向对象补全计划 设计模式 之 实现一个简单的有限状态机-CSDN博客 当时我对代码下的有限状态机只有一个想法&#xff0c;设计巧妙&#…

数据结构与算法学习day21-回溯法

一、组合 1.题目 . - 力扣&#xff08;LeetCode&#xff09; 2思路 把组合问题抽象成树形结构&#xff08;N叉树&#xff09; 每次从集合中选取元素&#xff0c;可选择的范围随着选择的进行而收缩&#xff0c;调整可选择的范围。 图中可以发现n相当于树的宽度&#xff0c…

Linux(6)--CentOS目录

文章目录 1. 根目录2. cd目录切换命令3. CentOS目录介绍4. pwd命令介绍5. ls命令介绍5.1 ls5.2 ls -a5.3 ls -l 1. 根目录 Windows电脑的根目录是计算机(我的电脑)&#xff0c;然后C盘、D盘。 Linux系统的根目录是/&#xff0c;我们可以使用cd /进入根目录&#xff0c;然后使…

客户端/服务器的简易实现

目录 一,网络编程套接字 二,UDP/TCP的区别(​编辑) 三,UDP API使用 四,TCP API使用 一,网络编程套接字 socket socket(操作系统给应用程序的API,起了一个名字,就成为socket API) socket API提供了两套API分别为UDP和TCP: 二,UDP/TCP的区别() TCP有链接,可靠传输,面向字…

图解view_transformation(可视化BEV视角转换的过程)

BEV视图生成的流程总结&#xff1a; &#xff08;1&#xff09;生成视锥 &#xff08;2&#xff09;将视锥由uv坐标系转到EGO坐标系 &#xff08;3&#xff09;视锥体素化 &#xff08;4&#xff09;bev_pool &#xff08;1&#xff09;生成视锥 长宽数量: 模型输入图片尺寸//…

Winform登录实现及工具栏切换

1、登录实现 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace LoginApp {public par…

峟思传感器在水库坝体渗漏防治措施中的应用

在水库工程管理中&#xff0c;坝体渗漏是一个不容忽视的问题&#xff0c;它不仅影响水库的正常运行&#xff0c;还可能对下游地区造成严重的安全隐患。因此&#xff0c;采取有效的渗漏防治措施至关重要。在这一过程中&#xff0c;传感器作为关键的技术手段&#xff0c;发挥着不…

react + antDesignPro 企业微信扫码登录

效果 实现步骤 1、项目中document.ejs文件引入企微js链接 注意&#xff1a;技术栈是使用的react antDesignPro&#xff0c;不同的技术栈有不同的入口文件&#xff08;如vue在html文件引入&#xff09; <script src"https://wwcdn.weixin.qq.com/node/wework/wwopen/j…

02 ETH

以太坊与比特币有什么不同&#xff1f; 以太坊立足比特币创新之上&#xff0c;于 2015 年启动&#xff0c;两者之间有一些显著不同。 比特币就仅仅是比特币&#xff1b;以太坊包括以太币&#xff0c;以太币才是和比特币对等的存在。以太坊是可编程的&#xff0c;所以你可以在…

Mybatis+Druid+MybatisPlus多数据源配置

MybatisDruidMybatisPlus多数据源配置 平常我们使用的是 properties 或者 yaml 来配置数据库的地址、用户名、密码等 但是这样只能配置一个数据源 现在我们想在一个项目里面配置多个数据源&#xff0c;那么我们就需要配置自己的配置类 配置类和配置文件 Mybatismysqldruid配置…

[数据集][目标检测]棉花叶子病害检测数据集VOC+YOLO格式977张22类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;977 标注数量(xml文件个数)&#xff1a;977 标注数量(txt文件个数)&#xff1a;977 标注类别…

Linux标准IO-系统调用详解

1.1 系统调用 系统调用&#xff08;system call&#xff09;其实是 Linux 内核提供给应用层的应用编程接口&#xff08;API&#xff09;&#xff0c;是 Linux 应用层进入内核的入口。不止 Linux 系统&#xff0c;所有的操作系统都会向应用层提供系统调用&#xff0c;应用程序通…

软件测试技术之 GPU 单元测试是什么!

1 背景 测试是开发的一个非常重要的方面&#xff0c;可以在很大程度上决定一个应用程序的命运。良好的测试可以在早期捕获导致应用程序崩溃的问题&#xff0c;但较差的测试往往总是导致故障和停机。 单元测试用于测试各个代码组件&#xff0c;并确保代码按照预期的方式工作。单…

《MmAP : Multi-Modal Alignment Prompt for Cross-Domain Multi-Task Learning》中文校对版

系列论文研读目录 文章目录 系列论文研读目录摘要1 引言2 相关工作3 方法3.1对比图像预训练3.2 多模式对齐提示3.3 多任务提示学习框架 4 实验4.1基准设置4.2实验结果4.3消融研究 5、结论 摘要 多任务学习&#xff08;Multi-Task Learning&#xff0c;MTL&#xff09;是为了同…

Vue3.0组合式API:使用defineEmits()实现子组件向父组件传递数据

1、使用 defineEmits() 函数 父组件通过使用 Prop 为子组件传递数据&#xff0c;但如果子组件要把数据传递回去&#xff0c;就需要使用自定义事件来实现。父组件可以通过 v-on 指令&#xff08;简写形式“”&#xff09;监听子组件实例的自定义事件&#xff0c;而子组件可以通…