【华为OD-E卷 - 报数游戏 100分(python、java、c++、js、c)】
【华为OD-E卷 - 报数游戏 100分(python、java、c++、js、c)】
题目
100个人围成一圈,每个人有一个编码,编号从1开始到100。
他们从1开始依次报数,报到为M的人自动退出圈圈,然后下一个人接着从1开始报数,直到剩余的人数小于M。
请问最后剩余的人在原先的编号为多少?
输入描述
- 输入一个整数参数 M
输出描述
- 如果输入参数M小于等于1或者大于等于100,输出“ERROR!”;
否则按照原先的编号从小到大的顺序,以英文逗号分割输出编号字符串
用例
用例一:
输入:
3
输出:
58,91
用例二:
输入:
4
输出:
34,45,97
python解法
- 解题思路:
- 这个问题类似于约瑟夫环的变形。题目要求从1到100的100个人围成一圈,每次按照给定的间隔 m 依次淘汰人,直到剩下的人数少于 m 为止,最后输出剩下的人的编号,并按从小到大排序。
解题步骤:
初始化人数:创建 people 列表,包含 1 到 100 的编号。
设置初始索引:用 idx = 0 表示当前淘汰的位置索引。
模拟淘汰过程:
每次按照 m 计算需要淘汰的索引 (idx + m - 1) % len(people)
pop() 移除相应索引处的人
直到 people 数量小于 m 时停止
排序并输出:将剩下的 people 按升序排序,并用 “,” 连接成字符串返回。
m = int(input()) # 读取输入的整数 mdef iterative_solution(m):# 判断 m 是否在有效范围内if m <= 1 or m >= 100:return "ERROR!" # 输入无效时返回 "ERROR!"people = list(range(1, 101)) # 初始化 1~100 的列表idx = 0 # 初始化当前索引while len(people) >= m: # 当剩余人数不少于 m 时,继续淘汰idx = (idx + m - 1) % len(people) # 计算当前淘汰的位置people.pop(idx) # 移除该索引位置的元素return ",".join(map(str, sorted(people))) # 返回剩余人数,按升序排序并转换为字符串print(iterative_solution(m)) # 输出结果
java解法
- 解题思路
- 这个问题本质上是一个变形的约瑟夫问题,要求从 1 到 100 个人中,每次按照 m 报数并淘汰,直到剩余人数少于 m。然后输出剩下的人的编号,按从小到大排序。
解题步骤
输入 m:
如果 m 不满足 1 < m < 100,直接返回 “ERROR!”。
初始化数据结构:
removed[100] 作为布尔数组,用于记录哪些人已被淘汰(true 表示已淘汰)。
count 记录当前报数到多少。
remaining 记录当前剩余人数,初始化为 100。
currentIndex 记录当前正在报数的人的索引,初始化为 0。
模拟报数淘汰过程:
遍历 removed 数组,跳过已淘汰的人,只对未淘汰的人进行报数。
每当 count == m 时,淘汰该人(设置 removed[currentIndex] = true),重置 count 并减少 remaining。
使用 currentIndex = (currentIndex + 1) % 100 来循环遍历整个数组。
筛选剩余人员并输出:
遍历 removed 数组,将未淘汰的人的编号加入 StringJoiner 并返回
import java.util.Scanner;
import java.util.StringJoiner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt(); // 读取输入的整数 mSystem.out.println(getResult(m)); // 调用函数并输出结果}public static String getResult(int m) {// 判断 m 是否在有效范围内if (m <= 1 || m >= 100) return "ERROR!";boolean[] removed = new boolean[100]; // 标记哪些人被淘汰int count = 0; // 报数计数int remaining = 100; // 剩余人数int currentIndex = 0; // 当前报数的位置// 只要剩余人数不少于 m,就继续淘汰while (remaining >= m) {// 仅对未被淘汰的人进行报数if (!removed[currentIndex]) {count++; // 计数器 +1// 当报数达到 m 时,该人被淘汰if (count == m) {removed[currentIndex] = true; // 标记该人被淘汰count = 0; // 重置计数器remaining--; // 剩余人数减少}}// 移动到下一个人(循环列表)currentIndex = (currentIndex + 1) % 100;}// 使用 StringJoiner 构造剩余未被淘汰的人的编号字符串StringJoiner sj = new StringJoiner(",");for (int i = 0; i < 100; i++) {if (!removed[i]) {sj.add(String.valueOf(i + 1)); // 添加未被淘汰的人编号(编号从1开始)}}return sj.toString(); // 返回最终结果字符串}
}
C++解法
- 解题思路
- 输入 m:
若 m 不满足 1 < m < 100,直接输出 “ERROR!” 并退出。
初始化 people 数组:
使用 vector 存储 1~100 的编号。
模拟报数淘汰过程:
设定 idx 作为当前要淘汰的索引,初始值 0。
循环淘汰:当 people 数量 不少于 m 时:
计算下一轮被淘汰者的索引位置:idx = (idx + m - 1) % people.size();
使用 erase() 移除该索引处的人。
排序并输出结果:
sort(people.begin(), people.end()); 保障剩下的编号按升序排列。
逐个打印剩下的编号,并使用 “,” 进行分隔
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {int m;cin >> m; // 读取输入的整数 m// 判断 m 是否在有效范围内if (m <= 1 || m >= 100) {cout << "ERROR!" << endl;return 0;}vector<int> people(100); // 存储 1~100 的人for (int i = 0; i < 100; ++i) {people[i] = i + 1; // 初始化编号}int idx = 0; // 当前淘汰位置索引// 只要剩余人数不少于 m,就继续淘汰while (people.size() >= m) {idx = (idx + m - 1) % people.size(); // 计算当前淘汰的人people.erase(people.begin() + idx); // 移除该索引处的人}sort(people.begin(), people.end()); // 确保剩下的编号升序排列// 输出最终剩余的人的编号for (size_t i = 0; i < people.size(); ++i) {cout << people[i];if (i != people.size() - 1) cout << ","; // 逗号分隔输出}return 0;
}
C解法
更新中
JS解法
若 m 不在有效范围 1 < m < 100,返回 “ERROR!”。
初始化 people 数组:
使用 Array.from({ length: 100 }, (_, i) => i + 1) 创建 1~100 的编号数组。
模拟报数淘汰过程:
设定 index 作为当前要淘汰的索引,初始值 0。
循环淘汰:当 people 数量 不少于 m 时:
计算当前需要淘汰的索引 index = (index + m - 1) % people.length
使用 splice(index, 1) 移除该索引处的人。
返回剩余人员编号:
people.join() 将剩余编号以 , 分隔并返回
const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});// 监听标准输入,读取用户输入的 m
rl.on("line", (line) => {const m = parseInt(line); // 解析输入的整数 mconsole.log(calculateSurvivors(m)); // 计算并输出剩余编号
});// 计算最终剩余的人员编号
function calculateSurvivors(m) {// 检查输入 m 是否有效if (m <= 1 || m >= 100) {return "ERROR!";}// 初始化 1~100 的编号数组const people = Array.from({ length: 100 }, (_, i) => i + 1);let index = 0; // 当前淘汰索引// 只要剩余人数不少于 m,就继续淘汰while (people.length >= m) {index = (index + m - 1) % people.length; // 计算当前要淘汰的索引people.splice(index, 1); // 移除该索引处的人}return people.join(); // 返回剩余人员的编号,以 "," 连接
}
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
相关文章:
【华为OD-E卷 - 报数游戏 100分(python、java、c++、js、c)】
【华为OD-E卷 - 报数游戏 100分(python、java、c、js、c)】 题目 100个人围成一圈,每个人有一个编码,编号从1开始到100。 他们从1开始依次报数,报到为M的人自动退出圈圈,然后下一个人接着从1开始报数&…...
深入理解Spring框架:从基础到实践
前言 Spring框架是一个开源的企业级应用开发框架,它为Java开发者提供了灵活的架构支持,特别是在依赖注入(IOC)和面向切面编程(AOP)方面。本文将通过具体的示例,带你从Spring框架的概述、IOC容器…...
一觉醒来全球编码能力下降100000倍,新手小白的我决定科普C语言——函数
1. 函数的概念 数学中我们其实就⻅过函数的概念,⽐如:⼀次函数 y kx b ,k和b都是常数,给⼀个任意的 x,就得到⼀个y值。其实在C语⾔也引⼊函数(function)的概念,有些翻译为…...
CentOS 上安装 Go (Golang)
1. 检查系统环境 确保系统为 CentOS 7 或 CentOS 8,或者其他兼容的 Linux 发行版。 cat /etc/os-release2. 安装依赖 安装一些必要的工具: sudo yum update -y sudo yum install -y wget tar3. 下载 Go 从 Go 官方下载页面获取适用于 Linux 的最新版…...
软件模拟I2C案例前提须知——EEPROM芯片之M24C02
引言 了解了I2C的基础知识后,我们将来使用一个I2C案例实践来深入理解I2C通讯,即软件模拟I2C。顾名思义,就是利用软件方式通过模拟I2C协议要求的时序或者说一些相关规定来实现一个I2C通讯协议,然后利用模拟出的I2C协议来实现两个设…...
GIS教程:全国数码商城系统
文章目录 注册高德地图API普通网页中测试地图加载地图添加标记地图配置点标记 Marker添加弹框创建vue项目并添加高德地图创建项目加载高德地图项目首页布局封装axios和配置代理服务器获取城市热门信息获取城市区县信息获取区县商城信息获取指定城市区县的经纬度坐标将地图缩放到…...
BroadCom-RDMA博通网卡如何进行驱动安装和设置使得对应网口具有RDMA功能以适配RDMA相机
BroadCom-RDMA博通网卡如何进行驱动安装和设置使得对应网口具有RDMA功能以适配RDMA相机 BroadCom-RDMA 博通网卡Baumer-RDMA 万兆网相机Baumer工业相机RDMA功能的技术背景BroadCom-RDMA博通网卡如何进行驱动安装和设置具有RDMA功能一、安装ZVA-BroadCom-RDMA网卡二、设备管理器…...
分布式微服务系统架构第90集:现代化金融核心系统
#1.1 深化数字化转型,核心面临新挑战 1、架构侧:无法敏捷协同数字金融经营模式转型。 2、需求侧:业务需求传导低效始终困扰金融机构。 3、开发侧:创新产品上市速度低于期望。 4、运维侧:传统面向资源型监控体系难以支撑…...
进阶数据结构——双向循环链表
目录 前言一、定义与结构二、特点与优势三、基本操作四、应用场景五、实现复杂度六、动态图解七、代码模版(c)八、经典例题九、总结结语 前言 这一期我们学习双向循环链表。双向循环链表不同于单链表,双向循环链表是一种特殊的数据结构&…...
记录一次,PyQT的报错,多线程Udp失效,使用工具如netstat来检查端口使用情况。
1.问题 报错Exception in thread Thread-1: Traceback (most recent call last): File "threading.py", line 932, in _bootstrap_inner File "threading.py", line 870, in run File "main.py", line 456, in udp_recv IndexError: list…...
安装anaconda3 后 电脑如何单独运行python,python还需要独立安装吗?
安装anaconda3 后 电脑如何单独运行python,python还需要独立安装吗? 电脑第一此安装anaconda用于jupyter notebook使用。 但是在运行cmd的时候,输入python --version 显示未安装或跳转商店提示安装。 明明我可以运行python但是为什么cmd却说我没安装呢…...
电子电气架构 --- 汽车电子拓扑架构的演进过程
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…...
ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务
目录 一、ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务 1. app.Services 2. GetRequiredService() 3. Init() 二、应用场景 三、依赖注入使用拓展 1、使用场景 2、使用步骤 1. 定义服务接口和实现类 2. 注册服务到依赖注入容器 3. 使用依赖注入获取并…...
leetcode——验证二叉搜索树(java)
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例 1: 输入…...
搜索引擎快速收录:关键词布局的艺术
本文来自:百万收录网 原文链接:https://www.baiwanshoulu.com/21.html 搜索引擎快速收录中的关键词布局,是一项既精细又富有策略性的工作。以下是对关键词布局艺术的详细阐述: 一、关键词布局的重要性 关键词布局影响着后期页面…...
VLN视觉语言导航基础
0 概述 视觉语言导航模型旨在构建导航决策模型 π π π,在 t t t时刻,模型能够根据指令 W W W、历史轨迹 τ { V 1 , V 2 , . . . , V t − 1 } \tau\{V_1,V_2,...,V_{t-1}\} τ{V1,V2,...,Vt−1}和当前观察 V t { P t , R t , N ( V t ) } V_…...
4 Hadoop 面试真题
4 Hadoop 面试真题 1. Apache Hadoop 3.0.02. HDFS 3.x 数据存储新特性-纠删码Hadoop面试真题 1. Apache Hadoop 3.0.0 Apache Hadoop 3.0.0在以前的主要发行版本(hadoop-2.x)上进行了许多重大改进。 最低要求的Java版本从Java 7增加到Java 8 现在&…...
java练习(2)
回文数(题目来自力扣) 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数 是指正序(从左向右)和倒序(从右向左)读都是一样的整…...
vscode命令面板输入 CMake:build不执行提示输入
CMake:build或rebuild不编译了,弹出:> [Add a new preset] , 提示输入发现settings.jsons设置有问题 { "workbench.colorTheme": "Default Light", "cmake.pinnedCommands": [ "workbench.action.tasks.configu…...
Java中对消息序列化和反序列化并且加入到Spring消息容器中
--- 参考项目:苍穹外卖。 在对没有Java中的数据序列化时,比如说时间格式: 时间的格式是这种没有格式化的效果,因为在给前端返回数据时,返回的结果并没有序列化。 所以,需要对返回的数据序列化。 首先需…...
Hasklig字体终极指南:多语言编程环境中的完美适配方案
Hasklig字体终极指南:多语言编程环境中的完美适配方案 【免费下载链接】Hasklig Hasklig - a code font with monospaced ligatures 项目地址: https://gitcode.com/gh_mirrors/ha/Hasklig Hasklig是一款专为程序员设计的等宽字体,通过智能连字技…...
Halcon图像高效转换:HObject到Bitmap的优化实践(20ms内完成)
1. 为什么需要HObject到Bitmap的高效转换 在工业视觉和深度学习应用中,Halcon的HObject图像格式和Windows平台的Bitmap格式就像两个说着不同语言的人。我遇到过太多这样的场景:当我们需要把Halcon处理后的图像交给TensorFlow做推理,或者要在…...
Qwen3-Embedding-4B快速上手:5分钟部署,体验119语种向量化
Qwen3-Embedding-4B快速上手:5分钟部署,体验119语种向量化 1. 认识Qwen3-Embedding-4B 1.1 什么是文本向量化? 想象你走进一家大型图书馆,面对成千上万本书籍。如果让你手动查找与"人工智能"相关的书籍,你…...
猫抓插件:5分钟掌握浏览器视频下载终极指南
猫抓插件:5分钟掌握浏览器视频下载终极指南 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾经遇到过想要保存网页视频却找不到下载按钮的烦恼?或者想收藏在线音乐却只…...
LiuJuan Z-Image Generator真实案例:为独立音乐人生成专辑封面人像全流程
LiuJuan Z-Image Generator真实案例:为独立音乐人生成专辑封面人像全流程 最近,一位独立音乐人朋友找到我,说他想为自己的新专辑设计一个封面。预算有限,请不起专业画师,但又不想要那些千篇一律的模板。他想要一张能体…...
UOS20远程桌面XRDP配置指南:告别黑屏卡顿,轻松实现Windows远程连接
UOS20远程桌面XRDP配置实战:从零搭建流畅的Windows远程控制环境 在混合办公成为常态的今天,跨平台远程控制需求激增。UOS20作为国产操作系统的代表,其XRDP服务能让Windows用户无缝接入,但配置过程中的黑屏、卡顿问题常令人却步。…...
YOLOv8模型剪枝实战:如何利用BN层特性实现高效通道裁剪(附完整代码)
YOLOv8模型剪枝实战:从BN层特性到工程化部署的完整指南 在计算机视觉领域,YOLOv8凭借其卓越的实时检测性能已成为工业界的热门选择。但当我们将模型部署到资源受限的边缘设备时,模型大小和计算效率往往成为瓶颈。本文将深入探讨如何利用BN层γ…...
CTF新手必看:攻防世界幂数加密题解(附Python脚本)
CTF密码学实战:从零破解幂数加密的完整指南 第一次接触CTF密码学题目时,看到那串神秘数字"8842101220480224404014224202480122",我的大脑就像被加密了一样完全空白。直到理解了幂数加密的精髓,才发现这不过是字母游戏…...
深入解析:set_clock_groups中-physically_exclusive与-asynchronous的约束协同与必要性
1. 从Spyglass报错看时钟约束的必要性 最近在跑Spyglass做SDC检查时,遇到了一个让我困惑的报错:"当两个时钟设置成物理互斥或逻辑互斥时,需要另外加上这两个时钟是异步设置的约束"。这让我很纳闷,明明已经设置了物理互…...
当人脸识别‘脸盲’时:ReID如何靠‘衣着体态’在安防、零售中找人?
当人脸识别失效时:ReID技术如何通过衣着体态实现精准追踪 在智慧城市建设和零售数字化转型的浪潮中,视频分析技术正面临一个尴尬的现实困境——当人脸识别因遮挡、远距离或背对摄像头等原因失效时,如何继续追踪目标人物?这个问题…...
