应用一 热土豆问题描述
热土豆传递问题:假设有N个人,有一个热土豆在这N个人中传递,每经过一个人称为传递一次,假设传递m次,最后在哪个人的手中,该人就出去,然后自动落到下一个人手中。如此往复下去,求最后剩下的那个人(因为只有一个人了,所以不可能再传递下去)?
问题实现
利用队列实现热土豆问题:参加游戏的人名列表name_list,每一次传递土豆的次数num,返回最后剩下的人名即可.
这里换个角度思考一下,因为土豆是传递的,所以它的位置是不断变化的,而人的位置是固定的,但是如果去掉第m个人后,余下的人的位置就要改变,复杂度还有有开销的。 换个角度想一下,能不能土豆位置不变,人们一直在变化呢?因为人们位置在变动,所以去掉第m个人时就不用额外的变动了 。
这是引入队列,将土豆放在队首位置,人的位置变化m次后(队首的人弹出,在队尾入队,依次来达到循环队列的形式),此时在队首的人就会被去掉,接着继续往复循环变化。直到队列剩下一人。
from pythonds.basic.queue import Queue
def hotPotato(namelist, num):
simqueue = Queue()
for name in namelist:
simqueue.enqueue(name)
while simqueue.size() > 1:
for i in range(num):
simqueue.enqueue(simqueue.dequeue()) #一次传递
simqueue.dequeue()
return simqueue.dequeue()
print(hotPotato(["Bill",