在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