队列应用之热土豆传递问题Python

队列应用之热土豆传递问题

  • 热土豆传递问题:假设有N个人,有一个热土豆在这N个人中传递,每经过一个人称为传递一次,假设传递m次,最后在哪个人的手中,该人就出去,然后自动落到下一个人手中。如此往复下去,求最后剩下的那个人(因为只有一个人了,所以不可能再传递下去)?

其实这道题就是一个循环判断问题。每次循环时将此时第m个位置的人去掉即可,然后将第m+1个人作为第一个人,继续循环。这个问题用循环队列比较简单。因为在复习队列,所以直接用队列做了。
这里换个角度思考一下,因为土豆是传递的,所以它的位置是不断变化的,而人的位置是固定的,但是如果去掉第m个人后,余下的人的位置就要改变,复杂度还有有开销的。换个角度想一下,能不能土豆位置不变,人们一直在变化呢?因为人们位置在变动,所以去掉第m个人时就不用额外的变动了
这是引入队列,将土豆放在队首位置,人的位置变化m次后(队首的人弹出,在队尾入队,依次来达到循环队列的形式),此时在队首的人就会被去掉,接着继续往复循环变化。直到队列剩下一人。

def hotPotato(nameList, num):
	# nameList为名单列表,num为每次土豆的传递次数
    queue = Queue()
    # 人名入队
    for name in nameList:
        queue.enqueue(name)

    while queue.size() > 1:
    	# 土豆在人们之间传递
        for i in range(num):
            queue.enqueue(queue.dequeue())
		# 一次传递结束后,将最终在队首的人弹出。
        queue.dequeue()
	# 传递结束,此时队内只剩下一人,弹出。
    return queue.dequeue()
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值