(约瑟夫环问题)有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那个人。
package aiqiyi; import java.util.ArrayList; public class Main { public static int leftPerson(int n) { // 用list来保存n个人,序号为1~n ArrayList<Integer> list = new ArrayList<Integer>(); for (int i = 1; i <= n; i++) { list.add(i); } // i=1,2,3,4,5,6,... int i = 1; // index的范围是:0~list.size()-1 int index = 0; // 当n为1(只剩一个人)时退出循环 while (n > 1) { // 如果index==list.size(),令它重新指向list的第一个元素,实现环的功能 if (index == list.size()) { index = 0; } // 如果报的数字是3的倍数 else if (i % 3 == 0) { list.remove(index); // 退出圈子 i++; // 下一次要报的数 n--; // 圈子的人数减1 } // 如果报的数字不是3的倍数 else { index++; // 下一个人 i++; // 下一次要报的数 } } // list中最后剩的那个人的序号 return list.get(0); } public static void main(String[] args) { for (int i = 1; i < 11; i++) { System.out.print(Main.leftPerson(i) + " "); } } }
输出结果:
1 2 2 1 4 1 4 7 1 4