标号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; } } }