今天研究了约瑟夫环问题,下面做总结:
首先解释约瑟夫环问题:有一天,国王心情很好,于是从监狱放出40个死囚,并让他们围成一个圈,从第一个人开始报数,报到3的就拖出去处死,然后再由下一个重新报数,如此循环剩下最后一个人,释放,问站在哪一个位置的人可以活着。
解题思路:目前想到的方法有数组,链表集合,递归,下面将用链表集合解决。
首先应该让他们连成环,然后在剔除数到3的人,循环即可,那么怎么让他们连成环呢,我们应该设置两个变量,一个用来做指针,一个用来计数,每当循环完成一遍则把指针归零,继续循环即可,另一个计数则是记录3的倍数,为什么记录三的倍数呢,主要是解决数到三的问题,即每次数到3就可以当成3和他的倍数关系,那么就好处理多了。
public static void main(String[] args) {
System.out.println(getNum(40,3));
}
public static int getNum(int num,int m) {
List<Integer> list = new ArrayList<>(); //设置链表
for (int i = 1; i <= num; i++) { //添加元素到链表
list.add(i);
}
int count = 1; //设置计数变量
for (int i = 0; 1 != list.size(); i++) { //循环处死,直到剩一个为止
if (i == list.size()) { //每当循环完成一遍,则i置零,继续循环
i = 0;
}
if (count % m == 0) { //当数到3的倍数,则删除
list.remove(i);
i--; //因为remove的同时会造成后面的数会往前补齐,则指针就会漏掉一个
}
count++; //计数
}
return list.get(0); //因为最后只剩一个所以取第一个即可
}