腾讯面试题, 2020年,让我们愉快的赛一次马!

最近, 有小伙伴去腾讯面试后, 给小编提了个问题:

64匹马,8个赛道,找出前4名,最少比赛多少场?

好的, 逻辑算法题, 考验逻辑思维能力的时候到了!!

情况分析一:计时赛

根据题目, 我们很快发现, 这个题目其实很“发散”, 没有一堆“条条框框”的限制.(小声BB: 其实就是条件没给全).

好的,那么我们就“鬼机灵”一下, 就假设它是“计时赛”啰!

很好,64匹马,8个赛道,那么只需要8次比赛就能根据时间得到最快的4匹马儿~

显然, 腾讯大厂不可能这么沙雕的吧?! 所以,我们不排除这种情况的前提下,必须去考虑“非计时赛”的这种更符合“大厂气质”的解决逻辑~

情况分析一:非计时赛

如果是非计时赛, 显然情况变得复杂了,但是,越是复杂的情况,才能显示出咱的聪明不是?!

首先,我们采用算法常用的思想“分而治之”,给64匹良驹分成8组,就A、B、C、D、E、F、G、H吧

每组8匹马, 按顺序编号:A1、A2、A3……依次类推~

接着,准备工作完成,我们开始让马儿跑一跑.

64匹马, 8个分组, 8条赛道

第一步(共跑了8次):8个分组各跑一次,保留每组的前4名(黄色区域), 然后淘汰掉每组的后四名(蓝色区域)

image

疑问??:

为啥淘汰8个分组每组的后4名?

:

注意看题,我们只需要跑的最快的前4名, 所以, 淘汰每组的后4名,因为前4名绝不可能出现在蓝色区域的马儿中!

第二步(共跑了1次):取每组第1名进行一次比赛,然后淘汰最后4名所在组的所有马

image

疑问??:

为什么每组第1名跑一次,淘汰后4名所在分组?

:

我们知道,经过第一步的赛马,我们已经得出了8个分组中的各自的组内排名,

但是8个分组,哪个分组更厉害呢?

我们不知道, 所以需要每个分组的第1名跑一次,得出8个分组的组外排名!

假设8个分组的第1名跑完后,前4名为A1、B1、C1、D1 , 所以,根据要求找到最快的4匹, 最快的4匹肯定在A、B、C、D, 4个组内, 绝对不可能出现在E、F、G、H, 4个分组内! 因为E、F、G、H中最快的马E1、F1、G1、H1 都没在前4名中,剩下的更不可能!

第三步(逻辑分析,无需跑): 经过了前两步的角逐,**A1可以晋级了!**因为它已经是64匹中最快的那匹了!!

我们只需要再找到剩下的最快的3匹即可! 我们把A1这匹马(蓝色)摘出去,不考虑.

灰色区域的6匹马直接淘汰即可!!!

为啥???

image

听我细细道来!

image

疑??:

为什么直接淘汰灰色区域的6匹马儿,它们犯了什么错?

:

谨记一条,题目需要我们找到最快的4匹马, 经过前两步(共跑了9次)的角逐,我们知道,A1、B1、C1、D1, 是8个分组“组外排名”的前4, 同时,A1又是A组内最快的,所以,A1肯定是64匹中最快的!!

但是,64匹中最快的第2名,第3名,第4名,暂时却找不出来了!

分析一波:

最快的第2名可能在哪个区间?

显然,只能在A2,或者B1! !!

为什么不能是A3或者B2或者C1?

你细品!

因为组内最快排名(前四)A1、A2、A3、A4, 组外最快排名(前四)A1、B1、C1、D1!

所以,最快的第2名只能在A2和B1中选! 没有其它选择!!

照此逻辑继续分析第2名和第4名,可以知道,最快的前4名不可能分布在灰色区域,所以,淘汰掉灰色区域的6匹马!

第四步(分类讨论):因为A1为最快的第一名,所以我们把它摘出去,不考虑了! 接下来的问题就是在A2、A3、A4、B1、B2、B3、C1、C2、D1, 9匹马中找到最快的3匹即可.

重点来了: 因为只有8个跑道,而我们有9匹马!

**所以,我们留下9匹马中的任意一匹! **

此处注意: 我们留下的这匹马可以分为两类来处理:

一类: 该马存在明显的比它慢的马!

image

二类: 该马不存在明显比它慢的马!

image

情况一: 留下“一类”马!

假设我们留B1!(C1,B2是明显慢于它的)

剩下的8匹去跑一次!

情景1(跑一次):

剩下的8匹跑完后,我们发现,B2或者C1跑进了前3名! 此时,留下的B1肯定是最快的前3名! 因为B1 比B2和C1都快!!

于是,我们顺利找到了64匹中最快的4匹

情景2(跑两次):

剩下的8匹跑完后,我们发现,B2或者C1没有跑进前3名!

此时,我们只能让B1、A2、A3、A4再跑一次, 取前三名即可!!

疑??: 为什么是B1、A2、A3、A4再跑一次? 而不是其它?

:

  1. 假设B2没有跑进前3名,则只能是A2、A3、A4跑进了前3;

所以B1和A2、A3、A4跑(注意,为什么不和C1跑,因为B1比C1快,无需跑!)

  1. 假设C1没有跑进前3名,则可能是A2、A3、A4、B2、B3跑进了前三,

B1比B2、B3快,无需再跑, 所以还是B1和A2、A3、A4跑!

情况一: 留下“二类”马!

假设我们留A4!(没有明显比它慢的马)

剩下的8匹去跑一次, 得到一个排名, 之后,再摘出第一名, 剩下的和A4跑一圈

这样我们得到最快的前四名!!

分析

可以看出,我们留下“一类”马的话,是可能存在一个“最优”结果,也就是只需要跑一次就能得出结果

而我们留下二类马的话, 则需要两次才能得出结果!!

结果

image

通过以上分析, 我们再看看题目要求,需要我们得出“最少比赛多少场?”

第一步 8 次

第二步 1 次

第三步 0 次

第四步 1 次 或 2 次

则最少 8 + 1 + 1 = 10

看似简单的一个问题,背后却隐藏着如此复杂的逻辑, “大厂风范” 尽显无疑~

聪明的小伙伴们有没有更高明的解决方案呢?

欢迎分享~~!

请关注我的订阅号

订阅号.png

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值