每次移出一个数,此时集合少一个元素。后续的元素往前挪一个位置,下一次依旧是当前位置开始数。因此,和count同步数的i,在删除一个元素后,应该不会到下一个元素,依旧停留在本元素位置。
package fortest;
import java.io.File;
import java.util.ArrayList;
import java.util.Scanner;
public class test {
public static void main(String[] args) {
System.out.println(getWinner(5, 9));
}
/*
* 参数 : number - 总共人数 , countNum - 报到就出列
* 返回值 : 幸存者
* 功能 : 从一开始报数,报到countNum就出列
* 注意 :
* 每次移出一个数,此时集合少一个元素。
* 当访问下一个元素时,其实就是当前删除位置的元素
* 由原来的元素往前挪一位变化而来
*/
private static int getWinner(int number, int countNum) {
// TODO Auto-generated method stub
if(countNum == 0 || countNum ==1) {
return number;
}
ArrayList<Integer> people = new ArrayList<>();
for(int i = 1; i <= number; i ++) {
people.add(i);
}
int count = 1;
for(int i = 0; people.size() != 1; i ++) {
if(i == people.size()) {
i = 0;
}
if(count%countNum == 0) {
people.remove(i--);
}
count ++;
}
return people.get(0);
}
}