本文首發於微信公衆號:"算法與編程之美",歡迎關注,及時瞭解更多此係列文章。
問題描述
問題描述:N個人圍成一圈,從第一個人開始報數,報到m的人出圈,剩下的人繼續從1開始報數,報到m的人出圈;如此往復,直到所有人出圈。(模擬此過程,輸出出圈的人的序號)。
解決方案
這道題涉及到的算法叫做“約瑟夫算法”,我們需要將列表內所有人類似排列成一個“圈”來解決,需要將前一次刪除後剩下的元素的索引不變,但是位置向前提。無限循環這個“圈”,直到刪除到只剩一個。
這道題的關鍵在於如何將每個數的索引數字固定,在刪除前一個數字後,後面的數字都應該在排序中加一。所以我們一開始需要創建一個列表,從1開始到含有位數的數字,代表每個數字的索引列表。
代碼示例:
def Josephus_problem(num,gap): location_list = [a for a in range(1,num+1)] if num == 1 : return else: index = 0 for i in range(num-1): index = (index + gap )%len(location_list) - 1 print("本次出局的人爲:",location_list[index]) del location_list[index] if index == 0: index = 0 print( "最後剩下的爲:",location_list[0])
Josephus_problem(5,3) |
結語
這道題的解決方法有很多種,這裏主要介紹一下這種算法。還有重點爲推導出(index + gap )%len(location_list)這個公式。
主編:王楠嵐
稿件來源:深度學習與文旅應用實驗室(DLETA)
本文分享自微信公衆號 - 算法與編程之美(algo_coding)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。