有10个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),
凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
分析:
将每个人编上坐标,并且给每个人定下最开始的下标,等只剩下最后一个人的时候,用他的坐标去找相应人的编号
下标 0 1 2 3 4 5 6 7 8 9 编号 1 2 3 4 5 6 7 8 9 10 第一次 1 1 2 - 1 2 - 1 2 - 1 第二次 2 2 - 1 2 - 1 2 第三次 3 - 1 2 - 1 第四次 4 2 - 1 第五次 5 2 -
public class CallNumber {
public static void main(String[] args) {
int value = callSurvivalNumber(1);
System.out.println(value);
}
public static int callSurvivalNumber(int count) {
if (count <= 0) {
throw new IllegalArgumentException("Count must >0");
}
boolean[] status = new boolean[count];
for (int i = 0; i < status.length; i++) {
status[i] = true;
}
int index = -1;
int counter = 0; //当前退出的人数 n-1
int current = 0; //当前人报的数
while (counter < status.length - 1) {
//index 成环
index = (index + 1) % status.length;//0
if (!status[index]) {
continue;
}
//报数
current = (current + 1) % 3; //1
//退出
if (current == 0) {
counter++;
status[index] = false;
}
}
for (int i = 0; i < status.length; i++) {
if (status[i]) {
return i + 1;//1-n 0-(n-1)
}
}
throw new RuntimeException("Not found");
}
}