天天看點

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
           

繼續閱讀