一、题目描述

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

二、输入描述

输入一个整数参数M。

三、输出描述

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

四、解题思路

我们可以使用模拟的方法来解决这个问题。首先,我们将100个人的编号存储在一个映射表中,编号从1到100。然后,从1开始按顺时针方向报数,每次报数到M时,将对应的编号从映射表中移除。重复这个过程,直到剩余的人数小于M。最后,输出剩余人的编号。

具体步骤如下:

  1. 读取输入的参数M;
  2. 如果M小于等于1或者大于等于100,输出"ERROR!"并结束程序;
  3. 创建一个映射表map,将100个人的编号存储在映射表中,编号从1到100;
  4. 初始化变量start为1,表示报数的起始值;
  5. 使用while循环,循环条件为映射表的大小大于等于M:
    • 创建一个迭代器iterator,遍历映射表;
    • 在迭代过程中,获取当前键值对的键和值;
    • 将当前键的值更新为start的值;
    • 如果当前值等于M,表示报数到M,将该键从映射表中移除,并将start重置为1;
  6. 使用StringBuilder构建结果字符串;
  7. 遍历映射表中的键值对,将键添加到结果字符串中,并在每个编号后面添加英文逗号;
  8. 删除结果字符串最后一个逗号;
  9. 输出结果字符串。

该算法使用模拟的方法解决约瑟夫环变形问题,按照题目要求进行报数和移除操作,直到剩余的人数小于M。最后输出剩余人的编号。算法的时间复杂度主要取决于循环的次数,由于最多循环100次,因此时间复杂度为O(1)。

五、Java算法源码

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int num = sc.nextInt();
    if (num <= 1 || num>= 100){
        System.out.println("ERROR!");
        return;
    }

    Map<Integer,Integer> map = new HashMap<Integer,Integer>();
    for (int i = 1; i < 101; i++) {
        map.put(i,i);
    }

    int start = 1 ;
    while (map.size() >= num){
        Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()){
            Map.Entry<Integer, Integer> next = iterator.next();
            Integer key = next.getKey();
            map.put(key,start++);
            Integer value = next.getValue();
            if (value == num){
                iterator.remove();
                start = 1;
            }
        }
    }

    StringBuilder builder = new StringBuilder();
    for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
        builder.append(entry.getKey()).append(",");
    }

    builder.deleteCharAt(builder.lastIndexOf(","));
    System.out.println(builder);
}

六、效果展示

华为OD机试真题 Java 实现【报数游戏】【2022Q4 100分】-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【基站维修工程师】【2023Q1 200分】,附详细解题思路

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

06-03 13:23