题目:
有4枚硬币,初始状态未知。你的眼睛被蒙住,看不到硬币的状态,但可以随便翻任何几个硬币。你每翻一次以后,如果4枚硬币的状态是全正面朝上或者全背面朝上,旁边的人会告诉你翻成功了。现在问你,最少翻几次可以保证成功?每次翻哪几枚?(百度2008年面试题)
解答:
这个题目的关键是分析翻转前后硬币组合中相同不相同的数目的关系,不必考虑硬币的顺序,因为考虑顺序的话,代价比较大。
方法一:尝试和回退的策略,假设一种可能性,然后尝试,不行回退尝试另一种可能性。
方法二:
1)固定一个硬币,翻转另外三个,如果成功,则结束;
2)如果不成功,那么前翻转的三个硬币有两种可能001或者110,而第4个硬币可能为0或1,则可能的情况是
a)前三个硬币是两个0,一个1,最后是0,即0010,前三个可以有多种排列情况,我们暂时不管,我们关心的是有几个0和几个1;
b)前三个硬币是两个0,一个1,最后是1,即0011,前三个可以有多种排列情况,我们暂时不管,我们关心的是有几个0和几个1;
c)前三个硬币是两个1,一个0,最后是0,即1100,前三个可以有多种排列情况,我们暂时不管,我们关心的是有几个0和几个1;
d)前三个硬币是两个1,一个0,最后是1,即1101,前三个可以有多种排列情况,我们暂时不管,我们关心的是有几个0和几个1;
3)翻转前三个硬币中的一个,翻转的可能是0,也可能是1,那么对上面几种情况分别测试:
对a来说,如果翻转的是0,那么变成:1010,如果翻转的是1,那么变成0000成功;
对b来说,如果翻转的是0,那么变成:1011,如果翻转的是1,那么变成0001成功;
对c来说,如果翻转的是0,那么变成:1110,如果翻转的是1,那么变成1000成功;
对d来说,如果翻转的是0,那么变成:1111,如果翻转的是1,那么变成1001成功;
总之翻转后,要不是三个一样的+一个不同的(1011、0001、1110、1000);要么是两个相同的对两个相同的(1010,1001);
4)问题变成上面两种可能性,假设是有三个相同一个不同的,我们每次翻转一个测试,不成功回复原样,测试先一个;
假设是两两相同的情况,先翻转前两个如果不成功,那么这两个一定是一个0一个1,另外两个也一定一个0一个1;
再翻转13,如果不成功;翻转14一定成功。
一道关于硬币翻转的面试题,要求在最少次数内翻转硬币,使得所有硬币正面或反面朝上。解答分析了翻转前后硬币组合的关系,并提供了两种方法:尝试和回退策略,以及固定一枚硬币翻转其余三枚的策略,详细解释了每种情况下的翻转步骤和逻辑。
1225

被折叠的 条评论
为什么被折叠?



