Python约瑟夫环问题
在2019腾讯提前批实习的笔试题中就出现了约瑟夫环的问题,
当时我用collections.deque来做的,每次动态的删除节点,并重新改变指向来实现的,
并没有细想过有没有更快的方法。
(由于这种方法过于简单,就不罗列出来了,需要的朋友自行了解deque的leftappend子方法即可)
参考知乎的这篇博客,我受到了很大的启发
因此记录其中的递归方法在这里,方便自己复习。
index before | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
第1轮 | 1 | 2 | x | 4 | 5 | 6 |
第2轮 | 4 | 5 | x | 1 | 2 | 3 |
第3轮 | 1 | 2 | x | 3 | 4 | x |
第4轮 | 2 | 3 | x | x | 1 | x |
第5轮 | 2 | x | x | x | 1(3) | x |
最后结果 | 1 | x | x | x | x | x |
下一轮删除节点后的编号是 old = (new + m - 1) % n + 1
def joseph(int n, int m)
if(n == 1):
return n;
return (self.joseph(n - 1, m) + m - 1) % n + 1