【华为OD题库-067】报数游戏-java

题目

· 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,最后剩下三个人。

思路

直接用list模拟实现即可。

比如:1 2 3 4 5 6 7 8 9 10,每次删除第四个数

第一次:1 2 3 5 6 7 8 9 10。4被删除,下一次还是从该位置计数(idx=3,val=5)

第二次:1 2 3 5 6 7 9 10。8被删除,下一次从(idx=6,val=9)开始计数

第三次:1 3 5 6 7 9 10。2被删除,idx=(6+3)%8=1开始计数

从上面的过程可以看出,每次删除的位置为:(i + m - 1) % list.size()其中i为计数起点,每次删除后list的size会减一。直到list.size小于m时,输出list的值即可

题解

java 复制代码
package hwod;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class CountNumGame {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        System.out.println(countNumGame(m));
    }

    //模拟
    private static String countNumGame(int m) {
        if (m <= 1 || m >= 100) return "ERROR!";
        List<Integer> list = new ArrayList<>();
        for (int i = 1; i <= 100; i++) {
            list.add(i);
        }
        int i = 0;//计数起点
        while (list.size() >= m) {
            i = (i + m - 1) % list.size();//需要删除的数
            list.remove(i);
        }
        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < m-1; j++) {
            if(j!=0) sb.append(",");
            sb.append(list.get(j));
        }

        return sb.toString();
    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

相关推荐
塔中妖5 天前
【华为OD】分割数组的最大差值
数据结构·算法·华为od
塔中妖6 天前
【华为OD】数字游戏
算法·游戏·华为od
熊文豪7 天前
【华为OD】找出通过车辆最多颜色
算法·华为od
塔中妖7 天前
【华为OD】环中最长子串2
算法·华为od
熊文豪7 天前
【华为OD】区块链文件转储系统
算法·华为od·区块链
塔中妖7 天前
【华为OD】Linux发行版的数量
linux·算法·华为od
熊文豪7 天前
【华为OD】阿里巴巴找黄金宝箱
算法·华为od
塔中妖7 天前
【华为OD】5G网络建设
网络·5g·华为od
塔中妖8 天前
【华为OD】查找接口成功率最优时间段
算法·链表·华为od
塔中妖8 天前
【华为OD】最大子矩阵和
算法·华为od·矩阵