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
路人只负责转发
我已经尽力了,只能做到这个程序,这个是结合网络路由协议设计出来的一种通信机制,但是也只能做到目前的程度,经过我一周零散时间的考虑,想要实现同时开灯,必须在状态里边提供计数器,能给个整数就行,这样就可以通过对信号进行计数来约定时间,否则我真的想不到办法了,以上答案仅仅是一个思路,而且我认为这个题缺乏必要条件,希望对你有帮助。