超详细解决困扰人的python典例:“有n个人围成一圈”式n里挑一

引语

记录学习路程,抛砖引玉。如有更好的算法或者出现错误,欢迎指点。

题目

有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几位。

案例实现

为方便大家理解,我详细说明一些函数的引用。如果觉得没必要,直接跳到最后代码页即可。
以下是我解题思路(假设有6个人):

  1. 建立列表former,然后把1~6六个元素添加到列表former中(用了range函数和append函数)
  2. 把former列表的第一个元素赋值给later然后移除(用了pop函数)
  3. 起一个变量count来判断每次移除的首元素是否整除3,如果不整除就重新给回给列表former(用了append函数,实现了围成一圈的首尾相连),如果整除的话就让他滚蛋退圈
  4. 最后判断列表former长度为1(即其剩下一个元素)时,打印列表former元素(最后剩下的元素是1)
    在这里插入图片描述
former = [] 
count = 0 
for i in range(1,7): 
    former.append(i)
while True: 
    if len(former) == 1: 
        break
    else: 
        count += 1 
        later = former[0] 
        former.pop(0) 
        if count == 3: 
            count = 0 
            continue 
        else: 
            former.append(later) 
print(former) 
"""
[1]
"""

range()函数

对于 range() 函数,有几个注意点:
(1)它表示的是左闭右开区间;
(2)它接收的参数必须是整数,可以是负数,但不能是浮点数等其它类型;
(3)它是不可变的序列类型,可以进行判断元素、查找元素、切片等操作,但不能修改元素;
(4)它是可迭代对象,却不是迭代器。

a=list(range(6))#默认从0开始
b=list(range(1,6))#左闭右开没有6
c=list(range(1,15,2))#左闭右开没有15,2为等差
print(a)
print(b)
print(c)
"""
[0, 1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 3, 5, 7, 9, 11, 13]
"""

为什么上面6个人案例的代码是range(1,7)呢~现在是不是茅塞顿开了呢^^

append()函数

在处理这个案例上运用这个函数实现了在数组列表后添加上相应的元素

c=list(range(1,15,2))
print(c)
c.append(19)
print(c)
"""
[1, 3, 5, 7, 9, 11, 13]
[1, 3, 5, 7, 9, 11, 13, 19]
"""

pop()函数

是的没错,最后介绍的就是移除,也是灭掉这个案例的大招。小例题如下,自己细品。

a1=list(range(6))
b1=list(range(1,6))
c1=list(range(1,15,2))
print(a1)
a=a1.pop(5)
print(a)
print(a1)
print("***************")
print(b1)
b=b1.pop(0)
print(b)
print(b1)
print("***************")
print(c1)
c=c1.pop(3)
print(c)
print(c1)

执行结果如下:

[0, 1, 2, 3, 4, 5]
5
[0, 1, 2, 3, 4]
***************
[1, 2, 3, 4, 5]
1
[2, 3, 4, 5]
***************
[1, 3, 5, 7, 9, 11, 13]
7
[1, 3, 5, 9, 11, 13]

完整代码

说了一大堆,其实也就是几行代码而已…

n = int(input("请输入有几个人围圈:"))
former = [] # 创个空列表
count = 0 #用来计数
for i in range(1,n+1): #把元素1~n顺序放入列表,再提一次,左闭右开所以是n+1
    former.append(i)
while True: 
    if len(former) == 1: # 如果列表的长度为1,结束收工
        break
    else: 
        count += 1 # 记数加1
        later = former[0] #取出列表当中的第一个元素,并赋值给later
        former.pop(0) #移除列表当中的第一个元素
        if count == 3: # 整除3的话续列没你份,赶紧滚蛋
            count = 0 
            continue 
        else: 
            former.append(later) #把不整除3的续入列表former后面
print("最后剩下的是第",former,"位") # 最后打印出剩余的那个仔

运行结果如下(假设有100人围圈):

请输入有几个人围圈:100
最后剩下的是第 [91]
  • 15
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值