腾讯二面,我被 “赛马” 问题难住了
很難一次答對的經(jīng)典面試題,處處是坑
大家好,我是魚皮。
今天分享一道我曾經(jīng)被難住了的面試題,也是一道大廠面試時經(jīng)常會被問到的面試題,賽馬問題。
題目其實(shí)不難,但是第一次被問到時,稍有不慎,就會答錯。所以,一起來學(xué)習(xí)下吧!
問題
有 64 匹馬 賽跑,沒有任何秒表之類的計時工具,跑道每次只允許 8 匹馬 同時比,問 最少 需要比賽幾場才能夠選出跑的最快的 前 4 名?
題目描述就這么多,大家可以先思考一下,然后在投票中給出答案吧~
(投票)
下面公布解題思路和答案。
解題思路
這道題目坑點(diǎn)很多,題目中任何一個數(shù)字的改動都會影響到最終結(jié)果,因此一定要明確題目上的關(guān)鍵數(shù)字。
網(wǎng)上也有很多題目的變種,比如 36 匹馬 6 個跑道找前三名,但思路都是一致的,下面我們模擬一下比賽全程。
第一輪
首先,跑道最多允許 8 匹馬同時比,那我們一定要最大程度地利用資源,每場比賽都要上滿 8 匹馬。
所以第一輪最簡單,無腦 將 64 匹馬分為 8 組,每組 8 匹馬比一場 就好了,共計 8 場比賽。
| 組 1 | 🐴 🐴 🐴 🐴 🐴 🐴 🐴 🐴 |
| 組 2 | 🐴 🐴 🐴 🐴 🐴 🐴 🐴 🐴 |
| 組 3 | 🐴 🐴 🐴 🐴 🐴 🐴 🐴 🐴 |
| 組 4 | 🐴 🐴 🐴 🐴 🐴 🐴 🐴 🐴 |
| 組 5 | 🐴 🐴 🐴 🐴 🐴 🐴 🐴 🐴 |
| 組 6 | 🐴 🐴 🐴 🐴 🐴 🐴 🐴 🐴 |
| 組 7 | 🐴 🐴 🐴 🐴 🐴 🐴 🐴 🐴 |
| 組 8 | 🐴 🐴 🐴 🐴 🐴 🐴 🐴 🐴 |
本輪比賽之后,由于題目要求選出前 4 名,因此,每組比賽第 4 名之后的馬可以直接淘汰,還剩 32 匹馬。
| 組 1 | 🐎 🐴 🐴 🐴 |
| 組 2 | 🐎 🐴 🐴 🐴 |
| 組 3 | 🐎 🐴 🐴 🐴 |
| 組 4 | 🐎 🐴 🐴 🐴 |
| 組 5 | 🐎 🐴 🐴 🐴 |
| 組 6 | 🐎 🐴 🐴 🐴 |
| 組 7 | 🐎 🐴 🐴 🐴 |
| 組 8 | 🐎 🐴 🐴 🐴 |
?
第二輪
第二輪開始,我們必須精打細(xì)算了。
最簡單的方式是將剩下的 32 匹馬直接分為 4 組去比賽,但其實(shí)利用上一輪的信息,我們可以有更好的方法。
讓上輪比賽中,每組第 1 名一起比賽 1 場,然后按照本輪比賽結(jié)果,選出前 4 組。
賽場:🐎 🐎 🐎 🐎 🐎 🐎 🐎 🐎
比賽結(jié)果:
| 組 1 | 🐎 🐴 🐴 🐴 |
| 組 2 | 🐎 🐴 🐴 🐴 |
| 組 3 | 🐎 🐴 🐴 🐴 |
| 組 4 | 🐎 🐴 🐴 🐴 |
| 組 5 | 🐎 🐴 🐴 🐴 |
這么操作的原因是:如果某個組的第一名都進(jìn)不了前 4,那這個組剩下的馬肯定也進(jìn)不了前 4,直接整組淘汰即可。
截止到目前,還剩下 16 匹馬,那這一輪淘汰到這里就結(jié)束了么?
其實(shí)并沒有,以這輪比賽排名第四的馬所在的組為例,這個組的冠軍最高也才第四名,那么這個組其他的馬也是可以被淘汰的。同理,可以淘汰更多的馬,剩余 10 匹。
| 組 1 | 🐎 🐴 🐴 🐴 |
| 組 2 | 🐎 🐴 🐴 🐴 |
| 組 3 | 🐎 🐴 🐴 🐴 |
| 組 4 | 🐎 🐴 🐴 🐴 |
現(xiàn)在場上還有 10 匹馬,看似勝利近在咫尺,但其實(shí),接下來才是關(guān)鍵!
第三輪
接下來我們的目標(biāo)是從 10 匹馬中選出前 4 名,但一場比賽只能容納 8 匹馬,那好像至少還得比兩場。
一步步來吧,先選 8 匹馬比一場唄,問題是選哪 8 匹馬呢?
不知道大家有沒有發(fā)現(xiàn),在無意中,冠軍已經(jīng)產(chǎn)生了,那就是組內(nèi)組外都未嘗敗績的那匹馬,強(qiáng)中之強(qiáng)!
| 組 1 | 🏆 🐴 🐴 🐴 |
| 組 2 | 🐎 🐴 🐴 |
| 組 3 | 🐎 🐴 |
| 組 4 | 🐎 |
因此,它不用再比了,目標(biāo)變成,從剩余 9 匹馬中選出第 2 - 4 名。
讓我們?nèi)我膺x 8 匹馬先比一場吧,選出前 3 名。
| 組 1 | 🏆 [ 🐴 🐴 🐴 ] 出戰(zhàn) |
| 組 2 | [ 🐎 🐴 🐴 ] 出戰(zhàn) |
| 組 3 | [ 🐎 🐴 ] 出戰(zhàn) |
| 組 4 | 🦓(未參與比賽的馬) |
那么最后一輪,還需要讓上輪沒比的馬與前 3 名比 1 場,萬一人家是黑馬呢?
賽場:🐎 🐴 🐴 🦓
至此,答案出來了,最少需要 8 + 1 + 1 + 1 = 11 場。
然而,這是一個錯誤答案!
其實(shí),還有更優(yōu)解!
在還剩 9 匹馬的時候,如果不任選 8 匹馬比賽,而是先移除組 2 的冠軍,讓剩下 8 匹馬賽一場。
如果這場比賽中,組 3 的冠軍拿了第一,那么由于之前已經(jīng)證明了組 2 的冠軍強(qiáng)于組 3 的冠軍,則前 4 名已經(jīng)確定,只需要比 10 場。如果它不是第一,那么還是要多比一場了。
因此正確答案是,最少需要 10 場,你做對了么?
最后,為什么這道題目會出現(xiàn)在程序員面試中呢?聰明的你一定發(fā)現(xiàn)了,上述的賽馬問題本質(zhì)上是一個 TopN(取前幾名)問題,可以通過分治的方式解決,是一種經(jīng)典的算法思維。如果是在分布式系統(tǒng)中,則體現(xiàn)了 并行計算 的優(yōu)勢,可以利用資源(比如有 8 個跑道)對各個組同時計算,從而提高運(yùn)算效率。此外,利用已有的數(shù)據(jù)結(jié)果也是非常重要的。
祝大家周末愉快,學(xué)到的話別忘了幫魚皮點(diǎn)個 贊 支持下吧!??
總結(jié)
以上是生活随笔為你收集整理的腾讯二面,我被 “赛马” 问题难住了的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。