队列应用之热土豆传递问题
- 热土豆传递问题:假设有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()