腾讯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)  

在这里插入图片描述
如有错误,欢迎评论指出。毕竟我太菜了。


四、归纳总结

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

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

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

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

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值