腾讯2020校园招聘数据分析(提前批)面试编程题 | 圆桌会议 「约瑟夫环」(2019.8.7)

数据分析岗,提前批,第一轮面试。

一道编程题。

❤️ 「完整面试内容」请在「我的秋招经验贴」中查看

《2020我的秋招总结帖 [数据分析岗] | 目录索引》


一、题目

  • 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)  

腾讯2020校园招聘数据分析(提前批)面试编程题 | 圆桌会议 「约瑟夫环」(2019.8.7)_第1张图片
如有错误,欢迎评论指出。毕竟我太菜了。


四、归纳总结

今天查阅了资料。发现其实这是 「约瑟夫环」问题。大致有递推、递归和模拟的三种思路。

我还没理解透彻。暂且分享一些我看着觉得还不错的资料。

  1. 《剑指offer:孩子们的游戏(圆圈中最后剩下的数)(Python)》
  2. 《约瑟夫环问题 ( 最简单的数学解法)》
  3. 《算法—约瑟夫环》

谢谢aa指出,「代码实现」已于2018年8月22日修改。

你可能感兴趣的:(#,Python编程,#,2020我的秋招总结,数据分析岗,数据分析岗秋招,面经,总结,学习资料汇总)