【算法题】报数游戏

312次阅读
没有评论

共计 1243 个字符,预计需要花费 4 分钟才能阅读完成。

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

/**
 * 标题:报数游戏 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限
 * 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,最后剩下三个人
 *
 * @since 2022年5月11日
 */
public class M_N_T_37 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int M = scanner.nextInt();

        if (M <= 1 || M >= 100) {
            System.out.println("ERROR!");
            return;
        }

//        int[] rens = new int[200];

        ArrayList<String> strings = new ArrayList<>();

        for (int i = 0; i < 100; i++) {
//            rens[i] = i + 1;
            strings.add(i + 1 + "");
        }

//        extracted(rens, 0, 0, 0);

        extracted(strings, M - 1, M);

        StringBuilder stringBuilder = new StringBuilder();
        for (String string : strings) {
            if (stringBuilder.length() == 0) {
                stringBuilder.append(string);
                continue;
            }
            stringBuilder.append(",").append(string);
        }

        System.out.println(stringBuilder);
    }

    private static void extracted(ArrayList<String> strings, int begin, int M) {
        if (strings.size() < M) {
            return;
        }
        int index = begin;
        for (int i = 0; i < strings.size(); i++) {
            if (i != index) {
                continue;
            }
            strings.remove(i);
            strings.add(i, "-1");
            index += M;
        }

        int next_begin = index - strings.size();
        strings.removeIf("-1"::equals);
        extracted(strings, next_begin, M);
    }
}
正文完
 
裴先生
版权声明:本站原创文章,由 裴先生 2022-05-11发表,共计1243字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
本站勉强运行: