約瑟夫環相似模型:已知有n我的,每次間隔k我的剔除一個,求最後一個剩餘的。python
此解法爲變種,k最初爲k-2,以後每次都加1。面試
例:n=5,k=3。從1開始,第一次間隔k-2=1,將3剔除,第二次間隔k-1=2,將1剔除。依此類推,直至剩餘最後一個元素。app
核心思路:將原列表複製多份橫向展開,同時將間隔存爲一個列表。每次根據間隔獲取被剔除的元素,同時將此元素存入一個剔除列表中。若被剔除元素不存在於剔除列表,則將其加入,若已存在,則順勢後移至從未加入剔除列表的元素,並將其加入。如此重複n-1次。面試遇到的題,當時只寫了思路,沒完成代碼ide
#! /usr/bin/env python3 # coding = utf-8 def one_left(n, k): list0 = [i for i in range(1, n + 1)] # 初始列表 listx = [] i = 0 while i <= 2*n: i += 1 listx += list0 # 根據循環次數獲得擴大列表 print("listx", listx) list1 = [] # 用於保存被篩掉的元素 intervals = [l for l in range(k - 2, k - 2 + n - 1)] print('intervals', intervals) current_key = 0 # 當前下標 for interval in intervals: # 最外層循環,循環次數爲n-1 current_key += (interval + 1) # 間隔數+1 if listx[current_key] not in list1: # 若是剔除元素不在list1中 list1.append(listx[current_key]) else: while True: if listx[current_key] in list1: current_key += 1 else: break list1.append(listx[current_key]) print('剔除列表爲:',list1) print('剩餘元素爲:',set(list0)-set(list1)) def main(): one_left(n=5, k=4) if __name__ == '__main__': main()