我时不时地会给我的朋友和同事一些难题。我把这些称为咖啡时间的挑战。题目被设计成很小的,但在短暂休息时要反复考虑的题目。
这些都是典型的不难的题目,并且通常都有多种解决方案。有时,人们用铅笔、纸和数学首要原则来解决这些问题。此外,人们也会通过写正则表达式、LINQ、Perl或Python脚本来解决*。解决方式有时优雅,有时用蛮力,这里并没有所谓正确或错误的方法,只要得到的是一个正确的答案。
*我喜欢使用VB6,只是因为我能够用这个!
我尽量选择不涉及聪明“陷阱”或“技巧”的难题。这类型的题目对于那些知晓其中秘密的人而言是微不足道的,同时再学习其中的技巧时,也给人留下失望的感觉。选择的这些难题都是可自描述的,不需要外界知识就能完成。
一个好的咖啡时间的挑战是,你需要去找的东西是立即可以理解的,而你面临的挑战是如何找到这个答案。
其中有些题目是我自己想出来的,但许多都不是,大部分是我从自己看到的一些想法中受到启发或复制而来的。这些题目在我的朋友和同事间颇为流行,因此,我想在我的博客上分享一些。
以下是精选的我最近的咖啡时间的挑战。对于其中的一些题目,我提供了提示,同时,所有题目我都给出了解决方案。
我提供了解决方案,因此如果你试图重新解决,你就可以来验证答案,不过我没有提供任何代码。解决这些难题的乐趣就在于写代码,而不是答案。这些乐趣不是来自得到了正确的答案,而是来自你能够写代码或脚本来得到正确的答案。
我并不是说这些都是很好的编程面试题,但我会说,如果你不能写代码来解决类似下面的那些难题,你应该认真考虑转行了:)
顺便说一句,你知道你一生花了多少钱在咖啡上吗?
1) 两基数
挑战:找到三个数X、Y、Z,使以10为基数的XYZ,等于以9为基数的ZYX。
下方是提示:(文字颜色为白色,选中下一行即可查看)
有更优雅的方式来解决这个问题,但解决方案集如此小,你可能也只有用暴力破解了。
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
44510 = 5449 ,X = 4 Y = 4 Z = 5
2) 一百万
挑战:将 1,000,000 写成两个数的乘积,两个数都不包含零。
下方是提示:(文字颜色为白色,选中下一行即可查看)
主要因素有哪些?确保数字5和2不是分开在两个数中。
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
15625, 64
3) 最大的数
挑战:用数字0-9 (共10个数字)来创建两个数字。当这两个数相乘时,能得到的最大结果是多少?
下方是提示:(文字颜色为白色,选中下一行即可查看)
更大的数字放在前面
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
875310 × 9642 = 8,439,739,020 或 87531 × 96420 = 8,439,739,020
4) 恰好1/3
挑战:将数字 1-9 排列成一个值,恰好等于1/3的简分数。没有其他数学符号,只是连接部分一些数字做分子,一些数字做分母。
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
5823 / 17469 或 5832 / 17496
5) 三个骰子
挑战:摇三个骰子,将得到的三个数相乘。结果是奇数的概率是多少?
下方是提示:(文字颜色为白色,选中下一行即可查看)
你应该能够不需要电脑做到这个!为了得到一个奇数的乘积结果,三个骰子都要摇出奇数。
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
1/8
6) Word文档
挑战:我打开一个Word文档,然后输入1-10000 的所有数字,用空格分隔(我没有使用任何“数千”标点符号,只是原始数据)。然后,我女儿过来使用搜索和替换,并将所有数字“0”替换为空格。如果我现在计算文档中所有数字的总和,那会是多少?(任何被一个或多个空格分隔的数都是一个独特的数)
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
37,359,001
7) 腿
挑战:一个房间里混杂有人和狗。里面有72个头 ,200条腿。有多少只狗在这个房间里?(没有诡计,没有染色体异常,没有残疾……)
下方是提示:(文字颜色为白色,选中下一行即可查看)
这是一个简单的代数问题。如果你需要编写代码来解决这个问题,请停止阅读。
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
28只狗
8) 一,二,三
挑战:只使用一个1,一个2和一个3(没有拼接的数字)及任何组合你想要的数学符号(加、减、乘、除、括号、指数、阶乘、平方根……)。写出一个方程,使其结果为19。
下方是提示:(文字颜色为白色,选中下一行即可查看)
你要么得到这个方程,要么不行。答案需要使用两次阶乘、一次平方根、一次除法和一次加法。
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
19=[((3!)!/2) + 1]^(1/2)
9) 一,七
挑战:如上题,如何只使用一个1和一个7使方程式结果为71?(同样,没有拼接的数字,或者说这样是微不足道的!)
下方是提示:(文字颜色为白色,选中下一行即可查看)
你要么得到这个方程,要么不行。答案需要使用一次阶乘、一次平方根和一次加法。
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
71=(7!+1)^(1/2)
10) 桶
挑战:将数字1-13分别放入三个桶中,满足任何桶中任意两个数的差与这两个数不在同一个桶中。(例如,如果将数字5和7放入一个桶中,那么不能将数字2放入同一个桶中)
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
[[2, 3, 7, 11, 12], [5, 6, 8, 9], [1, 4, 10, 13]] 或 [[2, 3, 11, 12], [5, 6, 7, 8, 9], [1, 4, 10, 13]]
11) 积与和
挑战:写下1到65,502以内的所有整数。从中选择两个数字,将其相乘得到一个乘积。划掉这两个数字,将余下的65,500个数字进行求和,得到的结果与乘积相同。应该选择哪两个数字?
下方是提示:(文字颜色为白色,选中下一行即可查看)
三角形数的公式是什么?
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
46,465 和 46,168
12) 相邻的平方数
挑战:排列整数1-17(包含17),使得相邻的两个数之和是一个完美的平方数。如14, 2, 7 …(第一个数和最后一个数没有形成环)
下方是提示:(文字颜色为白色,选中下一行即可查看)
可以多次使用一个平方数,并且这不会有太多可供选择的。遵循任何其他数字的可能数字的数量非常有限。
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
16 9 7 2 14 11 5 4 12 13 3 6 10 15 1 8 17
13) 有多少
挑战:ABCDEFGHIJ是一个10位数字的号码。所有的数字都是不同的。如果11111能整除这个10位数,存在多少个这样可能的数ABCDEFGHIJ?
下方是提示:(文字颜色为白色,选中下一行即可查看)
考虑主要因素还是暴力解决?如果使用暴力解决,如何减少需要检查的号码?
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
3456
14)倒数
挑战:寻找6个不同的整数:A, B, C, D, E, F。这6个数的倒数之和正好等于1。如: 1/A + 1/B + … 1/F = 1
下方是提示:(文字颜色为白色,选中下一行即可查看)
有很多可能的答案,你需要的就是其中之一。
下方是解决方案:(文字颜色为白色,选中下方区域即可查看)
1/2 + 1/4 + 1/6 + 1/18 + 1/60 + 1/90 = 1
1/2 + 1/4 + 1/6 + 1/18 + 1/63 + 1/84 = 1
1/2 + 1/4 + 1/6 + 1/19 + 1/57 + 1/76 = 1
1/2 + 1/4 + 1/6 + 1/20 + 1/45 + 1/90 = 1
1/2 + 1/4 + 1/6 + 1/20 + 1/48 + 1/80 = 1
1/2 + 1/4 + 1/6 + 1/20 + 1/50 + 1/75 = 1
1/2 + 1/4 + 1/6 + 1/20 + 1/55 + 1/66 = 1
1/2 + 1/4 + 1/6 + 1/21 + 1/42 + 1/84 = 1
1/2 + 1/4 + 1/6 + 1/21 + 1/44 + 1/77 = 1
1/2 + 1/4 + 1/6 + 1/22 + 1/36 + 1/99 = 1
1/2 + 1/4 + 1/6 + 1/22 + 1/44 + 1/66 = 1
1/2 + 1/4 + 1/6 + 1/24 + 1/32 + 1/96 = 1
1/2 + 1/4 + 1/6 + 1/24 + 1/33 + 1/88 = 1
1/2 + 1/4 + 1/6 + 1/24 + 1/36 + 1/72 = 1
1/2 + 1/4 + 1/6 + 1/24 + 1/40 + 1/60 = 1
1/2 + 1/4 + 1/6 + 1/24 + 1/42 + 1/56 = 1
1/2 + 1/4 + 1/6 + 1/25 + 1/30 + 1/100 = 1
…
…
15) 有趣的风扇
挑战:你正在帮一个出门度假的朋友看守房子。在一个房间里,你拉一个风扇的链条,当它没有响应时,你意识到这个房子暂时没有电。不幸的是,你现在要离开好几天。
你知道在你拉链条之前,风扇处于“关”的档位,连续地拉链条会使风扇循环的通过剩余的设置档位(“关”、“高”、“中”等)。你不知道这里有多少个设置档位,但你能确定不会超过四个。
如何能确保在电力恢复时,电扇处于“关”的档位?
下方是提示:(文字颜色为白色,选中下一行即可查看)
最小公倍数对你而言意味着什么呢?
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
不管这里的电扇速度设置是否是两个、三个或四个,如果你拉12次的链条,电扇会返回到“关”的档位。因此,拉电扇的链条11次以上。
16) LED时钟
挑战:你在一个完全黑暗的房间里。房间里唯一的光线来自一个旧的LED数字闹钟(屏幕显示为四个七段)。时钟显示为HH:MM(没有秒)。时钟被设置为以24小时制格式显示时间,并且如果不使用,前导数字为空。从房间最暗到最亮,这期间有多少时间?
下方是提示:(文字颜色为白色,选中下一行即可查看)
什么时候显示亮的数字最多?什么时候最少?
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
18小时57分钟(1:11 – 20:08)
17) 使用所有数字
挑战:寻找一个五位数,其中所有的数字都不相同且不为零。使得这个五位数等于这五个数字的所有三位数组合之和。即ABCDE等于ABC + ABD + ABE + BCA + CBA + BDA + DBA + … 等。
下方是提示:(文字颜色为白色,选中下一行即可查看)
每个数字出现在每个位置的频率是多少?
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
35964
18) 使用计算器按钮
挑战:我的女儿刚把橙汁泼在我的科学计算器上。数字键0-9和基本运算键+ – * /都卡住了(不工作)。幸运的是,所有的科学运算键(三角函数、幂、倒数、指数、对数、根、阶乘……)都能使用。当前屏幕显示为“0”。如何使用按键,使屏幕显示“1”,然后按下按钮,将显示转换为“2”,最后显示“3”?
下方是提示:(文字颜色为白色,选中下一行即可查看)
你可能发现通过简单的尝试这很容易。这有多种解决方案。你还记得你的基本触发点吗?
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
要获得“1”,只需按Cos键
要获得“2”,按Tan-1键,然后按Sin键,然后按1/X键,最后按X^2键
要获得“3”,按1/X键,然后按Sin-1键,然后按Tan键,然后按1/X键,最后按X^2键
19) 使用多个数字2
挑战:使用多个数字,有的容易,有的难。从中加入数学符号(阶乘、加、减、除、乘、平方根、三角函数、对数、小数点、指数……)来获得所要的结果。允许将数字拼接在一起。
1] 使用三个2获得结果11
2] 使用三个2获得结果1
3] 使用两个2获得结果10
4] 使用两个2获得结果5
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
[1] 22/2 [2] 2^(2-2) [3] 2 / .2 [4] [( .2)^(-2)]^(1/2)
20) 填池
挑战:如果使用红色软管将水填满游泳池,这需要8个半小时。如果同时使用红色软管和蓝色软管来将水填满游泳池,只需要5小时15分钟。如果只使用蓝色软管,需要多长时间能将水填满游泳池?
(所有常识简化应用:流速恒定,不要试图使用物理来让它变得复杂!)
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
357/26小时(约13小时44分钟)
21) 开始和结束
挑战:寻找一个最佳的以6结尾的自然数,如果将该数结尾的6去掉并放在剩余数的最前面,使得到的新数字是原数字的4倍大。
下方是解决方案:(文字颜色为白色,选中下一行即可查看)