实现100%通过率](http://pic.xiahunao.cn/yaotu/华为OD机试2025C卷-报数问题[100分]( Java _ Python3 _ C++ _ C语言 _ JsNode _ Go)实现100%通过率)
个人主页深夜coding算法 专栏系列2026年华为最新OD机试题库详解 一次订阅永久解锁 | 持续更新100篇 | 6语言全覆盖文章目录❄️前言☀️一题目描述 题目名称 题目内容 输入描述 输出描述 示例1 示例2☀️二题目解析☀️三解题思路 队列模拟法 公式递推法☀️四代码实现 C Java Python3 C语言 JavaScriptNode.js Go☀️五复杂度分析⭐ 六易错点坑1边界 M≤1 或 M≥100坑2输出要排序坑3报数从 1 开始☀️七举一反三共勉❄️前言报数问题就是约瑟夫环的变体。标准约瑟夫环是淘汰到只剩最后一个人这道题是淘汰到剩余人数小于M就停。核心不变用队列模拟或者公式递推都能做。☀️一题目描述 题目名称报数问题 题目内容100 个人围成一圈每个人有一个编码编号从 1 开始到 100。他们从 1 开始依次报数报到为M的人自动退出圈圈然后下一个人接着从 1 开始报数直到剩余的人数小于M。请问最后剩余的人在原先的编号为多少 输入描述输入一个整数参数M。 输出描述如果输入参数M ≤ 1或者M ≥ 100输出ERROR!否则按照原先的编号从小到大的顺序以英文逗号,分隔输出编号字符串 示例1输入 3 输出 58,91 示例2输入 4 输出 34,45,97☀️二题目解析要点解读固定 100 人人数固定不需要读入 N只读 M报到 M 淘汰经典约瑟夫环规则数到 M 的人出局剩余 M 时停止不是淘汰到最后一人而是淘汰到人数不够再淘汰一轮排序输出最后幸存者按编号从小到大输出逗号分隔☀️三解题思路 队列模拟法创建队列1~100只要队列长度 ≥ M就循环把前M-1个人从队头移到队尾报数通过第M个人出队淘汰队列中剩下的人就是答案排序输出 公式递推法约瑟夫环递推公式pos (pos M) % ii 从 2 到 N但由于淘汰到剩余 M就停公式法需要反过来推哪些位置存活模拟法更直观。☀️四代码实现 C#includeiostream#includequeue#includevector#includealgorithmusingnamespacestd;intmain(){intM;cinM;if(M1||M100){coutERROR!endl;return0;}queueintq;for(inti1;i100;i)q.push(i);while(q.size()M){for(inti1;iM;i){q.push(q.front());// 报数1~M-1移到队尾q.pop();}q.pop();// 报到M淘汰}vectorintans;while(!q.empty()){ans.push_back(q.front());q.pop();}sort(ans.begin(),ans.end());for(inti0;ians.size();i){if(i0)cout,;coutans[i];}coutendl;return0;} Javaimportjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);intMsc.nextInt();if(M1||M100){System.out.println(ERROR!);return;}QueueIntegerqnewLinkedList();for(inti1;i100;i)q.offer(i);while(q.size()M){for(inti1;iM;i)q.offer(q.poll());// 报数通过q.poll();// 淘汰}ListIntegeransnewArrayList(q);Collections.sort(ans);for(inti0;ians.size();i){if(i0)System.out.print(,);System.out.print(ans.get(i));}System.out.println();}} Python3Mint(input())ifM1orM100:print(ERROR!)exit()fromcollectionsimportdeque qdeque(range(1,101))whilelen(q)M:q.rotate(-(M-1))# 前 M-1 个移到队尾q.popleft()# 第 M 个淘汰anssorted(q)print(,.join(map(str,ans))) C语言#includestdio.h#includestdlib.hintmain(){intM;scanf(%d,M);if(M1||M100){printf(ERROR!\n);return0;}// 数组模拟队列intq[200],head0,tail100;for(inti0;i100;i)q[i]i1;intsize100;while(sizeM){for(inti1;iM;i){q[tail]q[head];// 移到队尾}head;// 淘汰size--;}// 剩余元素在 q[head..tail-1]已有序因为入队顺序for(intihead;itail;i){if(ihead)printf(,);printf(%d,q[i]);}printf(\n);return0;} JavaScriptNode.jsconstreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});rl.on(line,(line){constMparseInt(line);if(M1||M100){console.log(ERROR!);rl.close();return;}constqArray.from({length:100},(_,i)i1);lethead0;while(q.length-headM){for(leti1;iM;i)q.push(q[head]);// 报数通过移到队尾head;// 淘汰}constansq.slice(head).sort((a,b)a-b);console.log(ans.join(,));rl.close();}); Gopackagemainimport(fmtsort)funcmain(){varMintfmt.Scan(M)ifM1||M100{fmt.Println(ERROR!)return}q:make([]int,100)fori:0;i100;i{q[i]i1}head:0size:100forsizeM{fori:1;iM;i{qappend(q,q[head])// 移到队尾head}head// 淘汰size--}ans:make([]int,size)fori:0;isize;i{ans[i]q[headi]}sort.Ints(ans)fori,v:rangeans{ifi0{fmt.Print(,)}fmt.Print(v)}fmt.Println()}☀️五复杂度分析指标数值说明时间复杂度O(N²)每次移动 M-1 个元素N100 时完全可接受空间复杂度O(N)队列存储最多 100 个元素⭐ 六易错点坑1边界 M≤1 或 M≥100题目明确要求这两个范围输出ERROR!注意字符串里有个感叹号。坑2输出要排序题目要求从小到大的顺序队列里剩余的顺序是乱的去掉的要排序再输出。坑3报数从 1 开始每次淘汰后下一个人重新从 1 开始报数不是接着报。☀️七举一反三OJ直达 力扣 → 1823. 找出游戏的获胜者 — 约瑟夫环标准版 牛客网 → 华为机试专区共勉约瑟夫环是老朋友了。队列模拟法最直观面试问到直接上队列五分钟写完。OD机试不是考你数学功底是考你能不能把思路快速落地成代码。关于本专栏一次订阅永久解锁全部100篇真题详解6语言全覆盖Java | Python3 | C | C语言 | JsNode | Go以上就是本篇博客的所有内容觉得有帮助的话记得点赞收藏关注走一波~~