普通做法和用链表
- 普通做法
有两种,一种取模,一种是变换list,就是每消除一个就更新一下list。
import time
n =int(input('输入n:'))
k=int(input('输入k:'))
now=time.time()
lis=list(range(1,n+1))
while len(lis)>1:#还可以取模,pop()那个应该删除的元素,注意下标是从0开始的
#print(lis)
for i in range(k-1):
lis.append(lis.pop(0))
lis.pop(0)
print(lis[0])
print(time.time()-now)
输入n:100000
输入k:3
92620
1.4500620365142822
比用链表的方法明显时间长,那就应该这个用的空间小
- 链表(要成环)
- class中的self指的是类实例对象本身(注意:不是类本身)
import time
n =int(input('输入n:'))
k=int(input('输入k:'))
now=time.time()#后面试了一下两种方法的耗时
'''
lis=list(range(1,n+1))
while len(lis)>1:#还可以取模,pop()那个应该删除的元素,注意下标是从0开始的
#print(lis)
for i in range(k-1):
lis.append(lis.pop(0))
lis.pop(0)
print(lis[0])
'''
class Node(object):
def __init__(self, value):#这里的self改成a,然后下面改成a.value=value a.next=None
# 元素域
self.value = value
# 链接域
self.next = None
def creat(n):#创建链表环
if n==1:
return Node(1)#value
else:
rea=Node(1)
cur=rea
for i in range(2,n+1):
cur.next=Node(i)
cur=cur.next
cur.next=rea#成环
return rea
'''
#show 环
rea=creat(10)
cur=rea
while True:
print(rea.value)
rea=rea.next
if rea==None or rea==cur:
break
'''
def josephus(n,k):
if k==1:#只有一个的时候,那最后的就是n
print('最后的这个:',n)
rea=creat(n)
cur=rea
while True:
for i in range(k-2):#删除就是忽略要删除的将他的前一个和后一个相连
cur=cur.next
cur.next=cur.next.next
cur=cur.next
if cur.next==cur:#只有一个元素时
break
print('最后的这个:',cur.value)
josephus(n,k)
print(time.time()-now)
输入n:100000
输入k:3
最后的这个: 92620
0.16156840324401855