校招 刷题

1.约瑟夫环问题

思路:python列表,处理时有一定优势,因为可以随意拼接。

以前用c++ 写过一个。用循环链表。只需要构建一个循环列表就好。构建循环链表需要麻烦一些,但循环列表就是处理起来很方便。链表的删除很方便。

python程序的思路;

利用列表的可拼接性。

第一个while:

如果人数大于报的数,则直接可以去除,然后把去除的两边在拼接起来。

第二个while:(重点)

人数小于报的数,需要把列表直接拼接,拼接的列表,一定要大于报的数长度,为了避免特殊情况,长度大于列表现有长度+报数值,有时间复杂度要求,也可以用注释的替代。

然后去除值,截取现有长度-1(这个也要注意),直到列表只剩一个元素。


lis = [ i for i in range(1,101)] print(lis) m = 5 while len(lis) >= m: lis.remove(lis[m-1]) lis = lis[m-1:]+lis[0:m-1]
while len(lis) > 1:
n = len(lis)
print(n)
print(lis)
# if n < m:
# ind = m // n + 1
# # print(lis)
# lis = lis*ind + lis
# print(lis)
while len(lis) < m+n:
lis += lis
# print(len(lis))
# print(m-1)
lis.remove(lis[m-1])
lis = lis[m-1:m+n-2]
print(lis)

 

posted @ 2019-08-30 17:47  昔时  阅读(239)  评论(0编辑  收藏  举报