之前在某网站上看过一个号称“98%的人没解出的德国软件工程师面试逻辑题”,虽然不知道是真是假,但是今天姑且论论。
题目如下:“一桶16斤的水,还有一个8斤的空水桶,和一个3斤的空水桶,问如何平均而精确地分给4个人。”(注意那4个人是可以携带任意水的,博主求六步内的解法,但是其他人给了很多解法,但是没有真正六步内的。)。我想看完题目,很多人都已经有了一个普遍的思路,就是分!装!分!直到分出4个4斤的。其实再后面的帖子上确实有很多答案,不过解法都是一种类型,就是把这些水转移到这里,把这些水转移到那里。但是无论是一顿乱转还是先分出一个,再分两个,也就是按顺序分。但是从类型上来说其实都只是一种解法,也就是按照纯粹的“大脑逻辑进行数字分割”,咳咳,请原谅我纯野生的叙述方式,不过,在听了我的解题方式后,我想大家会更明白一些这种奇怪的描述。
其实在一开始我也是这样解的,不断地转移,转移,最后转出来。但是步骤简化之后好像还在8,9步的样子。面对着自己满满的草稿纸,我还是有几分疑惑,这难道真的是工程师的正确打开方式吗?我想不是。就在这个时候,我才突然想到了一个根本的问题,这是工程师的面试题,为什么我们做程序的工程师,要去解一道,很难用程序写出来,即使写出来了,也很难成为通用插件的逻辑题呢?------>那么,我们应该能用程序解出来吧。
就在那个时候,我才来了灵感。程序解问题是需要一些与问题细节无关的解决步骤的。那么对于这些问题,程序解决的的最好的方式,我想就是分解了。那么只需要写一个程序能根据N个数字(比如8,3)对某个数字(比如16)进行分解,然后进行拼接(比如4)就可以了。不过,既然知道了程序的解法,那么也就有了我们的一种思路。也就是首先找出,8,3对16的分解方法,然后再进行拼接。
这时我们先进行分解,比如16-->8=8,8,此时找出那4个等着要水的,然后8&8-->3=5,3,5,3,这时正在对5进行分解5-->3=3,2此时得到3,3,2,3,3,2,因为我们要得到的是4个4,而此时的数字明显还不够进行拼接,并且因为之前都是用3进行分解的,但是要对之后的数字进行分解,明显需要更小的数字对3进行增加,以减少无法单独分解的3,而2+2-->3=3,1明显不符合条件,而2位数字的相加再分解,效果看起来也不是很明朗,此时则应当建立3位数字的相加,分解,以此分解多余的3。不过,其实一开始,我优先考虑的就是3+3+3-->8=8,1。因为这时可以再得到,一个8和一个1,而8可以在进行第一步的分解,这样可以简化算法,而1刚好可以对3进行增加。
这时,我们对3,3,2,3,3,2进行3+3+3-->8=8,1的分解(中间步骤满足我们的4个人,三个桶的要求),此时,得到2,2,3,8,1,也就是1,2,2,3,再加上3,3,2,
又得到,三个3,在进行3+3+3-->8=8,1和8-->3-->3=3,3,2的分解。最后得到:1,1,2,2,2,2,3,3。这时已经得到了可以进行拼接的数组。
那么,我们的解法也就有了,第一,对16进行8-->3-->3=3,3,2和3+3+3-->8=8,1的循环分解。第二,拼接得到4个4。回答结束。
这大概就是我对这道问题的终极解法。其得益于编程思想,而编程思想又反哺于我们的生活。
“编程教给了我另一种思维方式。”——史蒂夫·乔布斯(《遗失的访谈》)