数据分析岗,提前批,第一轮面试。
一道编程题。
❤️ 「完整面试内容」请在「我的秋招经验贴」中查看
一、题目
- n个人,围一圈坐,从1开始编号;
- 从第s人开始,每隔m个人出列;
- 直至所有人出列
- 输出每次出列的人的序号
二、举一反三
一共有三十个人,从1-30依次编号。每次隔9个人就踢出去一个人。求踢出的前十五个人的号码:
- Python实现
a = [ x for x in range(1,31) ] #生成编号
del_number = 8 #该删除的编号
for i in range(15):
print a[del_number]
del a[del_number]
del_number = (del_number + 8) % len(a)
三、代码实现
受 上述例题的启发,我写的代码如下,
def fun(n, s, m):
a = [ x for x in range(1, n+1) ]
del_number = s-1 # 序号为s的人,实际上在数组的下标是 s-1
for i in range(len(a)-1):
print(a[del_number])
del a[del_number]
# 「每隔m人」,所以del_number + m,但是因为每次出列了一个人,所以往前挪一位。
del_number = (del_number + m -1) % len(a)
如有错误,欢迎评论指出。毕竟我太菜了。
四、归纳总结
今天查阅了资料。发现其实这是 「约瑟夫环」问题。大致有递推、递归和模拟的三种思路。
我还没理解透彻。暂且分享一些我看着觉得还不错的资料。
谢谢aa指出,「代码实现」已于2018年8月22日修改。