今天来分享下有关于Python的每日一题,蓝桥杯的备赛题及经验可能要鸽到周末来做了,话不多说,直接看题
已知n个人(以编号0,1,2,3...n-1分别表示)围坐在一张圆桌周围。从编号为0的人开始报数1,数到m的那个人出列;他的下一个人又从1开始报数,数到m+1的那个人又出列(每次报数值加1);依此规律重复下去,直到圆桌周围的人全部出列。
输入格式:
两个正整数n, m,其中3<=n<=100, 1<=m<=n
输出格式:
按照顺序出列的人的编号列表
输入样例:
5
2
输出样例:
[1, 4, 0, 2, 3]
输入样例:
12
3
输出样例:
[2, 6, 11, 7, 4, 5, 10, 9, 3, 1, 8, 0]
这个题目是典型的约瑟夫环问题 详情可以跳转链接约瑟夫问题_百度百科https://baike.baidu.com/item/%E7%BA%A6%E7%91%9F%E5%A4%AB%E9%97%AE%E9%A2%98/3857719?fr=aladdin
分析起来其实不难,难点在于前面一个报完数以后后面报数的人比前面报的数要多一个且当人数不够又要从头开始报数 但参考基本的约瑟夫问题的Python代码 其实不难 只要修改一点条件就行了
代码如下:
n,m=eval(input('请输入n和m的值')) lst1=list(range(n)) lst2=[] for i in range(n): for j in range(m): lst1.append(lst1.pop(0)) lst2.append(lst1.pop(-1)) m +=1 print(lst2)
可以看到代码其实很简短 这里用到了一些特定的函数 功能如下:
函数 | 功能 |
eval | 用来执行一个字符串表达式,并返回表达式的值 |
append | 在列表末尾添加新的对象 |
pop | 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值 |
解释下代码的意思 首先是输入n和m的值 因为input这里默认输入的为字符串类型需要用到eval函数将n和m的值转为整型 这里用int同理 然后再定义一个列表lst1来按顺序放入编号为0到n-1的人,定义lst2来放出列的人 用嵌套循环 lst1.append(lst1.pop(0))对应内层循环表示把出列的人前面的人放到列表的后面来 可以防止列表的越界 lst2.append(lst1.pop(-1))对应外层循环作用是让报数的人从lst1中出列到lst2中,后面m+=1表示每次出完列后 后面的人报数要加1 最后lst1中的人都出列完了以后循环终止 最后print输出
约瑟夫环的问题是一个很经典的算法模型,只要遇到一堆数据放在一个环形区域内满足一定条件出列直至数据清空都可以套用这个模型 这里用Python实行代码非常简单 也可以用C++中STL容器实现,今天的分享就到这里,明天随机准时更新内容。