问题描述:N个人围成一圈,从第一个人开始报数,报m数的人出圈,剩下的人继续从1开始报数,报到m数的人再出圈;如此往复,直到所有人出圈。(模拟此过程,输出出圈的人的序号)
public static void yesefu(int totalNum, int countNum) {
// 初始化人数
ArrayList<Integer> start = new ArrayList<Integer>();
for (int i = 1; i <= totalNum; i++) {
start.add(i);
}
int k = 0;// 数组下标从0开始
while (start.size() > 0) {
k = k + countNum;
// 第m人的索引位置
k = k % (start.size()) - 1;// 数组下标从0开始 进行取余是因为防止k大于圈中人的总数
// 判断是否到队尾,即k的大小为start的大小,此时k为-1
if (k < 0) {
// 如果到队尾了,则输出队尾元素
System.out.print(start.get(start.size() - 1) + " ");
start.remove(start.size() - 1);
k = 0;
} else {
// 否则直接输出k对应位置的元素
System.out.print(start.get(k) + " ");
start.remove(k);
}
}
}
public static void main(String[] args) {
yesefu(10, 3);
//3 6 9 2 7 1 8 5 10 4
//最后活下来的是4号
}