1. 程式人生 > >一個不簡潔的約瑟夫環解法

一個不簡潔的約瑟夫環解法

python 算法

約瑟夫環類似模型:已知有n個人,每次間隔k個人剔除一個,求最後一個剩余的。

此解法為變種,k最初為k-2,之後每次都加1。

例:n=5,k=3。從1開始,第一次間隔k-2=1,將3剔除,第二次間隔k-1=2,將1剔除。依此類推,直至剩余最後一個元素。


核心思路:將原列表復制多份橫向展開,每次根據間隔獲取被剔除的元素,同時將此元素存入一個剔除列表中。若被剔除元素不存在於剔除列表,則將其加入,若已存在,則順勢後移至從未加入剔除列表的元素,並將其加入。如此重復n-1次。面試遇到的題,當時只寫了思路,沒完成代碼技術分享

#! /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()

本文出自 “12477692” 博客,請務必保留此出處http://12487692.blog.51cto.com/12477692/1963987

一個不簡潔的約瑟夫環解法