原图:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
解题思路:假设五个人
1 2 3 4 5 第一次 就是 12312 就只剩下1245 此时再从第一位的时候就是3123 只剩下24 再接着就是12,再31 最后就只剩下4了。
难点就是怎么把整个读书循环起来,循环起来后,读到3的就剔除,这样到最后就只会剩下一个了。
网上有几种解题思路,有的复杂还不易读懂,下面这个是我看到的最容易懂的。
def example6(n):
"""
:param n: 人数
:return: 最后胜出者
"""
baoshu=0
num=[i for i in range(1,n+1)] #初始化人 从1开始
while len(num)>1: #长度为1的时候停止,num[0]就是胜出者
baoshu+=1 #计数器
num.append(num.pop(0)) #计数器执行一次,就把第一位数放到list的最后,达到循环读数的效果
if baoshu==3:
baoshu=0 #读三次,碰到的数字就是要移除的数字
num.pop() #读三次的时候,第三个数字被放到了list的最后面,所以直接pop()移除最后一个
print (num)
总结:灵活使用pop