首页 > 试题广场 >

环形链表的约瑟夫问题

[编程题]环形链表的约瑟夫问题
  • 热度指数:3157 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
据说著名犹太历史学家 Josephus 有过以下故事:在罗马人占领乔塔帕特后,39 个犹太人与 Josephus 及他的朋友躲到一个洞中,39 个犹太人决定宁愿死也不要被敌人抓到,于是决定了一种自杀方式,41 个人排成一个圆圈,由第 1 个人开始报数,报数到 3 的人就自杀,然后再由下一个人重新报 1,报数到 3 的人再自杀,这样依次下去,直到剩下最后一个人时,那个人可以自由选择自己的命运。这就是著名的约瑟夫问题。现在请用单向环形链表得出最终存活的人的编号。


输入描述:
一行两个整数 n 和 m, n 表示环形链表的长度, m 表示每次报数到 m 就自杀。


输出描述:
输出最后存活下来的人编号(编号从1开始到n)
示例1

输入

5 2

输出

3

备注:
n,m=map(int,input().split())
l=list(range(1,n+1))
res=0
#模拟删除过程
#每次去掉一个人
#相当于i+1
for i in range(1,n+1):
    res=(res+m)%i
print(res+1)

发表于 2021-06-30 09:47:17 回复(0)
class ListNode:
    def __init__(self, x):
        # 保存节点的数据
        self.val = x
        # 下一个节点的地址
        self.next = None

def create(length):
    head_node = ListNode(1)
    res = head_node
    for i in range(2, length+1):
        head_node.next = ListNode(i)
        head_node = head_node.next
    head_node.next = res
    return res

def josephus_kill_1(head, m):
    '''
    返回最终剩下的那个结点
    时间复杂度为o(m*len(ringlinkedlist))
    '''
    p = head
    if not p:
        return -1
    count = 1
    while p.next != p:
        count+=1
        if count==m:
            temp = p.next
            p.next = temp.next
            del temp
            count = 1
        p = p.next

    print(p.val)
        

if __name__=="__main__":
    n, m = map(int,input().split())
    phead = create(n)
    josephus_kill_1(phead,m)
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。点击对比用例标准输出与你的输出
case通过率为66.67%
请问怎么解决?牛客上刷题总是遇到这个问题。
发表于 2020-07-22 18:06:02 回复(0)

问题信息

上传者:小小
难度:
2条回答 6381浏览

热门推荐

通过挑战的用户

查看代码