Python的约瑟夫环问题

普通做法和用链表
  • 普通做法
    有两种,一种取模,一种是变换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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值