报数游戏 - 华为OD统一考试(E卷)

news/2024/9/29 12:22:05 标签: 游戏, 华为od, 华为od机试, 算法, 笔试, python, java

2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集

华为OD机试

题目描述

100个人围成一圈,每个人有一个编号,编号从1开始到100。他们从1开始依次报数,报到为M的人自动退出圈圈,然后下一个人接着从1开始报数,直到剩余的人数小于M。请问最后剩余的人在原先的编号为多少?

输入描述

输入一个整数参数M。

输出描述

如果输入参数M小于等于1或者大于等于100,输出"ERROR!";否则按照原先的编号从小到大的顺序,以逗号分割输出编号字符串。

示例1

输入:
3

输出:
58,91

说明:
输入M为3,最后剩下两个人

示例2

输入:
4

输出:
34,45,97

说明:
输入M为4,最后剩下三个人

题解

该问题属于循环链表问题,可以通过约瑟夫环(Josephus Problem)的思路来解决。这类问题的关键在于模拟一个按固定规则报数和删除的过程。通过循环报数,每次删除报到特定数字的人,并在下次从紧邻剩下的人重新开始报数,直到剩下的人数少于M。


解题思路:

  1. 输入校验:首先检查输入的整数参数 M 是否在有效范围(1 < M < 100)内。如果无效则输出 "ERROR!"
  2. 初始化队列:使用一个列表或者链表来保存1到100的编号。这个队列将模拟人围成一圈的情况。
  3. 循环删除元素:从编号为1开始报数,每当报到数字 M 时,移除该人(即从队列中删除该元素),并从下一个人重新开始报数。
  4. 处理循环:为了模拟围成一圈的过程,当到达列表末尾时,需要从头继续开始报数。
  5. 输出结果:当剩下的人数少于 M 时,按照编号升序输出剩下的编号,以逗号分隔。

Java

java">import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

/**
 * @author code5bug
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int M = sc.nextInt();
        if (M <= 1 || M >= 100) {
            System.out.println("ERROR!");
            return;
        }

        List<String> nums = new LinkedList<>();
        for (int i = 1; i <= 100; i++) {
            nums.add(String.valueOf(i));
        }

        Iterator<String> it = nums.iterator();
        for (int now = 1; nums.size() >= M; now++) {
            if (!it.hasNext()) it = nums.iterator(); // 回到开头
            it.next(); // 遍历下一个

            if (now == M) {
                // 注意: Iterator 的 remove() 方法只能在调用 next() 之后使用
                it.remove();
                now = 0;
            }
        }

        System.out.println(String.join(",", nums));	// 输出剩余元素
    }
}

Python

python">def main():
    M = int(input())
    if M <= 1 or M >= 100:
        print("ERROR!")
        return

    nums = [str(i) for i in range(1, 101)]  # 初始化编号列表

    index = 0
    now = 1
    while len(nums) >= M:
        if now == M:
            nums.pop(index)	# 删除当前编号
            now = 0	# 重置计数
        else:
            # 如果当前位置是最后一个元素,回到第一个位置(循环列表效果)
            index = (index + 1) % len(nums)
        now += 1

    print(",".join(nums))	# 输出剩余编号


if __name__ == "__main__":
    main()

C++

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int M;
    cin >> M;
    if (M <= 1 || M >= 100) {
        cout << "ERROR!" << endl;
        return 0;
    }

    list<int> nums;
    for (int i = 1; i <= 100; i++) nums.push_back(i);

    int now = 1;
    for (auto it = nums.begin(); nums.size() >= M; now++) {
        if (it == nums.end()) it = nums.begin();   // 回到链表开头

        if (now == M) {
            // 注意这里 it = 不要漏写
            it  = nums.erase(it);   // 删除当前元素并更新迭代器
            now = 0;                // 重置计数
        } else {
            it++;
        }
    }

    for (auto it = nums.begin(); it != nums.end();) {
        cout << *it;
        if (++it != nums.end()) cout << ",";
    }
    cout << endl;

    return 0;
}

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏


http://www.niftyadmin.cn/n/5683010.html

相关文章

车辆重识别(利用扩散模型合成有效数据进行行人再识别预训练)论文阅读2024/9/27

[1]Synthesizing Efficient Data with Diffusion Models for Person Re-Identification Pre-Training 作者&#xff1a;Ke Niu1, Haiyang Yu1, Xuelin Qian2, Teng Fu1, Bin Li1, Xiangyang Xue1*单位&#xff1a;1复旦大学, 2西北工业大学 摘要&#xff1a; 现有的行人重识别…

CSS 的背景样式

1.1 背景颜色 1.2 背景图片 1.3 背景平铺 1.4 背景图片位置 1.4.1 方位名词 1.4.2 精确单位 1.4.3 混合单位 1.5 背景图像固定 1.6 背景复合写法 1.7 背景色半透明 1.8 总结

总结uwsgi+anaconda+django启动遇到的问题

一、问题描述 Django中&#xff0c;anconda环境下安装uwsgi&#xff0c;启动遇到的问题&#xff1a; 按照正常的启动方式启动&#xff1a; uwsgi --ini uwsgi_py.ini 但是报错&#xff1a; Traceback (most recent call last):File "/opt/myproject/myproject/wsgi.p…

2024网安周 | 百度安全深度参与,探索人工智能与数字安全的融合发展之路

9月9日-15日&#xff0c;2024年国家网络安全宣传周在全国范围内统一举行&#xff0c;本届网安周继续以“网络安全为人民&#xff0c;网络安全靠人民”为主题&#xff0c;由中央宣传部、中央网信办、教育部、工业和信息化部、公安部、中国人民银行、国家广播电视总局、全国总工会…

【AI变现】探索AI领域的财富密码:5大AI变现路径解析

随着现代科技的高速发展&#xff0c;AI已经不只是一个概念工具&#xff0c;它正在深刻地改变着我们的生活方式、工作模式和商业模式。 在这个AI无处不在的时代&#xff0c;如何抓住机遇&#xff0c;利用AI技术创造财富&#xff0c;成为了许多人关注的焦点。 接下来&#xff0…

QT--基础

将默认提供的程序都注释上意义 0101.pro QT core gui #QT表示要引入的类库 core&#xff1a;核心库 gui&#xff1a;图形化界面库 #如果要使用其他库类中的相关函数&#xff0c;则需要加对应的库类后&#xff0c;才能使用 greaterThan(QT_MAJOR_VERSION, 4): QT wid…

HI3520DV510 22AP80/SS522V100 芯片及开发板

22AP80是针对多路高清/超高清&#xff08;1080P/4M/5M/4K&#xff09;DVR产品应用开发的新一代专业SoC芯片。 22AP80集成了ARM Cortex-A7四核处理器和性能强大的图像分析工具推理引擎&#xff0c;支持多种智能算法应 用。同时&#xff0c;22AP80还集成了多路MIPI D-PHY接口输入…

前端vuex

需要共享的数据适合存储到vuex中 state基本使用 如果开启strict严格模式&#xff0c;直接修改上图的age会报错提示。不能在组件中直接修改state 总结&#xff1a; 分模块使用