偶然间刷题看到, 在此分享下解答流程思路
首先n个人报数, 只留下最后一人, 由此可知, 具体需要的循环次数我们并不知道(可以用while, 这里采用的是for循环), 我们可以采用一个数组保存这n个人, 设置一个变量currentNum保存当前报数的数字, 设置一个count记录还剩多少人, 剩余一人break跳出循环, 当数组遍历到尾时, 设置下标为0重新循环, 代码如下:
/**
* 题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
* 例如;如果10个人 留下的是4号
*/
public static void main(String[] args) {
String[] arr = {"one", "two", "three", "four", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth"};
// 当前报数字
int currentNum = 1;
int count = arr.length;
for (int i = 0; ; i++) {
// 只剩一人, 跳出循环
if (count==1) {
break;
}
// 循环结束重新遍历
if (i >= arr.length) {
i = 0;
}
// 当arr[i]为null是, 跳过此次循环, 注意: 此次i值增加, currentNum不变
if (arr[i] == null) {
continue;
}
// currentNum为3时, 减少一人
if (currentNum % 3 == 0) {
count--;
arr[i] = null;
}
// 改变currentNum的值, 超过三重新设置为1
if (currentNum == 3) {
currentNum = 1;
} else {
currentNum++;
}
}
for (int i = 0; i < arr.length; i++) {
if (arr[i] != null) {
System.out.println("留下的为" + (i+1) + "号");
}
}
System.out.println(Arrays.toString(arr));
}
控制台打印结果
此处人数是固定的, 也可以通过键盘输入动态生成, 这里不做具体演示了