腾讯提前批笔试题-1-圆桌会议

这篇博客介绍了腾讯提前批笔试中的一道算法题——圆桌会议,与经典的约瑟夫环问题类似。题目要求在n个人围坐的圆桌上,从第s个人开始报数,数到m的人出列,直至所有人都出列。博客提供了两种解决方案,一种是通过维护环形链表实现,时间复杂度为o(mn),另一种是寻找递推公式,时间复杂度为o(n)。文章还讨论了递推公式的推导过程。
摘要由CSDN通过智能技术生成

腾讯提前批笔试题1–圆桌会议

题目描述:

  有n个人围坐在一个圆桌周围进行一场圆桌会议。会议开始前从第s个人开始报数,数到第m的人就出列退出会议,然后从出列的下一个人重新开始报数,数到第m的人又出列,…,如此重复直到所有人全部出列为止。现在希望你能够求出按退出会议次序得到的人员的序号序列。
  输入描述:三个正整数n, s, m,均小于10000。
  输出描述:退出会议次序序号,一行一个。

相似题目:剑指offer50题(孩子们的游戏(圆圈中最后剩下的数))

题目描述:

  每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)

简洁描述:

  0,1,…,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。(约瑟夫环问题)

解决方案1:维护一个环形链表

  时间复杂度o(mn),空间复杂度o(n)

解决方案2:寻找递推公式

  1. 定义一个关于n和m的方程f(m, n),表示每次在n个数字(0,1,…,n-1)中删除第m个数字后剩下的数字。
  2. 第一个被删除的数字是(m-1)%n,设为k。
  3. 剩下的n-1个数字为:0,1,…,k-1,k+1,…,n-1;将下次起始的k+1排在最前面得到k+1,…,n-1,0,1,…,k-1,该序列最后剩下的数字也是关于n和m的函数,但因序列的起始位置不同而与最初的序列不同,所以用方程记为g(n-1,m)。
  4. 显然,两个序列删除后剩余的数字是一样的,即f(n,m)=g(n-1,m)。
  5. 将k+1,…,n-1,0,1,…,k-1映射为0,…,n-2的序列,映射关系记为p,则p(x)=(x-k-1)%n,逆映射p^(-1)(x)=(x+k+1)%n。
  6. 映射后的序列与最初系列有相同的形式,可得g(n-1,m)=p^(-1)[f(n-1,m)]=[f(n-1,m)+k+1]%n
  7. 因g(n-1,m)=f(n,m),k=(m-1)%n,可得f(n,m)=[f(n-1,m)+(m-1)%n+1]%n
  8. 书上得到的最后的递推公式为f(n,m)=[f(n-1,m)+m]%n,但是目前还没有想通转化方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值