约瑟夫问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。
有n个囚犯站成一个圆圈,准备处决。首先从一个人开始,越过 k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过 k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。
问题是,给定了n和k,一开始要站在什么地方才能避免被处决?
这里不研究数学解法,用java模拟整个过程。
通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解,而ArrayList下标正好从0开始,代码如下:
public static void main(String[] args) {
joseph(4, 2, 1);
}
/**
* @param total 总人数
* @param count 数到几出列
* @param start 从谁开始
*/
public static void joseph(int total, int count, int start){
ArrayList<String> list = new ArrayList<String>();
for (int i = 1; i <= total; i++) {
list.add("person-"+i);
}
int startIndex = start - 1;
int countActual = count - 1;
while(list.size() > 0) {
startIndex = (startIndex + countActual) % list.size();
System.out.println(list);
System.out.println(list.get(startIndex));
list.remove(startIndex);
}
}
结果如下: