1. 精選程序員面試常問的邏輯題
精選程序員面試常問的邏輯題1. 紅白帽子推理題目描述:一群人開舞會,每人頭上都戴著一頂帽子。帽子只有黑白兩種,黑的至少有一頂。每個人都能看到其他人帽子的顏色,卻看不到自己的。主持人先讓大家看看別人頭上戴的是什麼帽子,然後關燈,如果有人認為自己戴的是黑帽子,就打自己一個耳光。第一次關燈,沒有聲音。於是再開燈,大家再看一遍,關燈時仍然鴉雀無聲。一直到第三次關燈,才有劈劈啪啪打耳光的聲音響起。問有多少人戴著黑帽子?
答案:三個人。
若是兩個人,設A、B是黑帽子,第二次關燈就會有人打耳光。因為A看到B第一次沒打耳光,就知道B也一定看到了有帶黑帽子的人,可A除了知道B帶黑帽子外,其他人都是白帽子,就可推出他自己是帶黑帽子的人。同理B也是這么想的,這樣第二次熄燈會有兩個耳光的聲音。
如果是三個人,A、B、C。A第一次沒打耳光,因為他看到B、C都是帶黑帽子的;而且假設自己帶的是白帽子,這樣只有BC戴的是黑帽子;按照只有兩個人帶黑帽子的推論,第二次應該有人打耳光;可第二次卻沒有,於是他知道B和C一定看到了除BC之外的其他人帶了黑帽子,於是他知道BC看到的那個人一定是他,所以第三次有三個人打了自己一個耳光。
拓展:N個人是黑帽子,就會在第N天,有N個人打自己一個耳光。
2. 吃葯片題目描述:有兩種葯片,每種有兩個,一個人需要早上吃兩種葯片各一個,現在這四個葯片混在一起了,這個人有什麼方法吃?
答案:把所有的4顆葯丸都切開成相等的兩半,然後早上和晚上,分別吃掉每顆葯丸的一半。
3. 得到指定容量的水題目描述:一個5L,一個6L的瓶子,要得到3L的水,問什麼方法?
答案:6-5=1,1L水放在5L那個瓶裡面,然後再裝6L水,往5L(裡面已經有1L)裡面倒,這樣就會剩下2L水在6L裡面,再把2L水放在5L裡面,再裝一次,不就可以6L那裡到處3L水到5L裡面,自己就剩下3L了。
4. 老鼠/犯人喝酒試毒題目描述:一共1000瓶酒,其中一瓶有毒。如果一隻老鼠喝了有毒的酒,會在一天之後死亡,那麼如果給你一天時間,讓你判定哪瓶酒有毒,至少需要幾只老鼠?
答案:10隻。這個需要使用二進制編碼來解決,1000瓶酒至少需要10位二進制數來進行編碼。然後取十隻杯子分別代表這十個二進制數的十個位,分別將1000瓶酒倒入其編碼為1的對應的杯子中。取十個老鼠分別喝十個杯子中的酒,一天之後,就可以根據喝哪些杯子的老鼠死掉來確定出有毒的那瓶酒的編碼,從而確定哪瓶酒有毒。
拓展:
如果是常規利用二進制解題的話,那就需要14個犯人,2^14=16384>10000,但是這樣一來死亡時間這個條件就用不到,也不是最優解。
應該利用酒死的時間是固定的,一個罪犯像上面那樣可以表示成25種狀態,三個罪犯就可以表示25×25×25種狀態,超過10000了,所以只需要三個罪犯。
題目描述:有8個小球,其中七個的重量是相同的,有一個較輕。給你一個天平,問秤幾次能找出那個較輕的小球,若天平只能秤兩次,又該怎麼秤?
答案:第一次兩邊各放隨機三個,如果平了,則另外一個是輕的,若不平,還有第二次,拿出那三個輕的,在兩邊隨機放一個,就能測出哪個最輕了。
6. 飛機加油題目描述:已知:每個飛機只有一個油箱,飛機之間可以相互加油(注意是相互,沒有單獨的加油機),一箱油可供一架飛機繞地球飛半圈。問題:為使至少一架飛機繞地球一圈回到起飛時的飛機場,至少需要出動幾架飛機?(所有飛機從同一機場起飛,而且必須安全返回機場,不允許中途降落,中間沒有飛機場)
答案:分為3架飛機5架次和3架飛機6架次。
3架飛機6架次:
(圖解參考鏈接中的圖片)
ABC 3架同時起飛。
1/8處,C給AB加滿油,C返航。此時飛機的油量分別是:A: 3/4, B: 3/4, C: 3/4(返回時)。C分別給A和B加滿油後,三架飛機當前油量分別是:A: 1, B: 1, C: 1/4(剩餘)。C返回機場。A、B繼續向前飛行。
1/4處,B給A加滿油,B返航,A到達1/2處,此時C已經返回機場。三家飛機此時油量分別是:A: 3/4, B: 3/4(返回時), C: 0。B給A加滿油後,C加滿油,此時三架飛機的油量分別是:A: 1, B: 1/2, C: 1。然後B返回機場,A繼續向前飛行。
當A飛行至半圈位置時,B已經返回機場並且加滿了油(假設加油時間為0),此時,B和C沿逆時針方向飛行,三架飛機當前油量分別是:A: 1/2, B: 1, C: 1。A繼續向前飛行。
當A飛行至另外半圈的1/4位置時,三架飛機剩餘油量分別是:A: 1/4, B: 3/4, C: 3/4。此時,C給B加滿油。此時三架飛機油量分別是:A: 1/4, B: 1, C: 1/2。C返回機場,B和A繼續向前飛行。
當A飛行至另外半圈的1/2位置時,C已經返回機場,A和B相遇,此時三架飛機剩餘油量分別是:A: 0, B: 3/4, C: 0。B給A加1/4的油,三架飛機剩餘油量:A: 1/4, B: 1/2, C: 1。C加滿油從機場逆時針飛出,B返回機場,A繼續向前飛行。
當A飛行至另外半圈的3/4位置時,A和C相遇。此時三架飛機的油量分別是:A: 0, B: 1/4(在機場准備起飛), C: 3/4。C給A加1/4的油,此時三架飛機的油量分別是:A: 1/4, B: 1/4(未起飛), C: 1/2。C掉頭返回機場,A和B繼續向前飛行。
三架飛機順利回到機場。
3飛機5架次:
(圖解參考鏈接中的圖片)
3 架飛機同時從機場出發,飛行八分之一周(A點),各耗油四分之一。此時某架飛機給其餘兩架補滿油,自己返回基地。
另一架飛機和目標機結伴,飛至四分之一周(B點),給目標機補滿油,自己返回。
目標機獨自飛行半周(C點)。
與從基地反向出發的一架飛機相遇,2 機將油平分,飛至最後八分之一處(D點)。
與從基地反向出發的另一機相遇,各分四分之一油,返回。
以上即為精選的程序員面試常問的邏輯題及其解答,希望能夠幫助到大家。
2. 一道程序員面試題,設計,很難
狀態0:初始狀態
狀態1:我是端點A
狀態2:我可能是端點B
狀態3:我是端點B
狀態4:我是路人
消息0:初始化消息
消息1:這是來自端點A的消息,我正在尋找端點B
消息2:你的另一邊還有我,你不是端點B
消息3:那麼誰是端點B呢
消息4:這是來自端點B的消息
消息5:這是來自端點A的消息
消息6,路人請在下一次接到消息5時開燈,端點A請開燈
回饋,將消息發給觸發當前消息的一端(誰給我的我就給誰)
轉發:將消息發給觸發當前消息的另一端(誰給我的我就不給誰)
廣播:將消息發給兩邊(給兩邊都發送)
收到初始化消息的人將自己置為狀態1,並轉發消息1,
收到消息1的人將自己置為狀態2,並轉發消息1,回饋消息2,
收到消息2的人將分為兩種:
狀態1,不改變狀態,並回饋消息3
狀態2,將自己置為狀態4,不發送消息
收到消息3的人將分為兩種:
狀態4,不改變狀態,轉發消息3
狀態2,將自己置為狀態3,回饋消息4
/*
至此為止,三種角色已經明確,兩個端點分別是狀態1和狀態3,狀態4是路人
*/
可能收到消息4的人分為三種:
端點A,回饋消息5
路人,轉發消息4
端點B,回饋消息4
收到消息5的人分為兩種:
路人,轉發消息5
端點B,
/*
當端點B收到消息5的時候,端點B還正在無限發送消息4,端點A正在無限發送消息5,路人正在無限轉發消息5和4
*/
此時所有路人都可能收到兩種消息,4和5,端點A只會收到4端點B只會收到5
端點A收到消息5則回饋消息4
端點B收到消息4則回饋消息5
路人只負責轉發
我已經盡力了,只能做到這個程序,這個是結合網路路由協議設計出來的一種通信機制,但是也只能做到目前的程度,經過我一周零散時間的考慮,想要實現同時開燈,必須在狀態里邊提供計數器,能給個整數就行,這樣就可以通過對信號進行計數來約定時間,否則我真的想不到辦法了,以上答案僅僅是一個思路,而且我認為這個題缺乏必要條件,希望對你有幫助。