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

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

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));
        }

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

华为OD机试题库题解2024 文章被收录于专栏

华为OD机考(CDE卷)题库(绝对都是原题),帮助你上岸华为(已经不少小伙伴成功上岸)。提供Java、Python、C++ 三种语言的解法。每篇文章都有详细的解题步骤、代码注释详细及相关知识点的练习题。有问题,随时解答。

全部评论
public static void main(String[] args) { Scanner in = new Scanner(System.in); int m = in.nextInt(); if(m < 1 || m > 100) { System.out.println("ERROR!"); }else { ArrayList<integer> list = new ArrayList<>(); for(int k = 1; k <= 100; k++) { list.add(k); } int i = 1; int j = m; while(list.size() >= m) { //i*m-1为不删除元素时的index //i-1为已删除的元素数量 //m-j为需要补足的数量,适用于循环时的偏移 int index=(i*m-1-(i-1)-(m-j)); if(index>=list.size()) { //超过list长度,计算需要补足的数量 j = (index+1)-list.size(); //去除补足数量对应的index list.remove(j-1); //i充置为1 i = 1; }else { list.remove(index); } i++; } System.out.println(list); } }</integer>
点赞 回复 分享
发布于 2024-09-19 19:52 上海
n=int(input()) l=[] re=[] fin=[] for i in range(100): l.append(0) i=0 count=0 while l.count(0)>=n: if(i==100): i=0 if(l[i]==0): count+=1 if count==n: l[i] = 1 re.append(i) count=0 i+=1 for i in range(100): if i not in re: fin.append(i+1) print(fin)
点赞 回复 分享
发布于 2024-12-04 18:28 山东

相关推荐

2024-12-09 12:21
门头沟学院 C++
l11hy:今早刚开,已满足
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务