在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