标号1-n的n个人首尾相接,1到3报数,报到3的退出,求最后一个人的标号

问题分析

循环问题, 递归方式处理,或者for循环处理。

1. 退出条件, 只剩下一个人: 退出人数 = n - 1

变化的数据

报数, 退出人数

public static int getLastPersonNumber(int n) {
        if (n < 1) {
            return -1;
        }
        //初始化人数列表
        int[] persons = new int[n + 1];
        for (int i = 1; i <= n; i++) {
            persons[i] = i;
        }
        //报数记录
        int report = 0;
        //退出人数记录
        int outCount = 0;
        //for循环报数
        for (int i = 1; ; i++) {
            if (i > n) { // i 既是下标, 也是编号
                i = 1;
            }
            if (persons[i] != 0) { //退出编号清0
                report++;
            }

            if (report == 3 && outCount != n - 1) { //报数为3了, 重置报数, 退出, 退出人数自增
                report = 0;
                persons[i] = 0;
                outCount++;
            } else if (outCount == n - 1) { //退出n-1个人, 只剩一个人
                return i;
            }
        }
    }
原文地址:https://www.cnblogs.com/selfchange/p/12736529.html