98%的人没解出的德国面试逻辑题 2016-03-05 09:01 352人阅读 评论(0) 收藏

之前在某网站上看过一个号称“98%的人没解出的德国软件工程师面试逻辑题”,虽然不知道是真是假,但是今天姑且论论。

//该文章,来自于我的另一个CSDN帐号,此处我对其优化.

题目如下:“一桶16斤的水,还有一个8斤的空水桶,和一个3斤的空水桶,问如何平均而精确地分给4个人。”(注意那4个人是可以携带任意水的,博主求六步内的解法,但是其他人给了很多解法,但是没有真正六步内的。)。

我想看完题目,很多人都已经有了一个普遍的思路,就是分!装!分!直到分出4个4斤的(其实这就是回答博主所有答案模式)。但是这并不算是程序员的打开方式。而是应该编写一个程序能根据N个数字(比如8,3)对某个数字(比如16)进行分解,然后进行拼接(比如4)就可以了。不过,既然知道了程序的解法,那么也就有了我们的一种思路。也就是首先找出,8,3对16的分解方法,然后再进行拼接。
为了方便表示,我们用Array all表示全部的水.用this.array表示此步得到的仅有此步分解的结果数组
这时我们先进行分解,比如

     16-->8=8+8
     //表示16斤水用8斤的桶进行分解,得到两份8斤的水,以下同理
     8*2-->3=(5+3)*2
     this.array=all=[3,3,5,5]
     //表示两份八斤的水,用3斤的桶进行分解,得到两份(五斤的水,和三斤的水),...
     5*2-->3=(3+2)*2

     this.array=[2,2,3,3]
     all=[2,2,3,3,3,3]

但是因为我们要得到的是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+3-->8=8+1
8-->5=5+3-->2+3+3
this.array=[1,2,3,3]
all=[1,2,2,2,3,3,3]

//重复上面的分解步骤
3+3+3-->8=8+1
8-->5=5+3-->2+3+3
this.array=[1,2,3,3]

all=[1,1,2,2,2,2,3,3]
//此时可得result=[4,4,4,4]

//简化以上步骤,

function xxx(...){
    for(...){
        ...
        8–>3–>3=3,3,2
        ...
        3+3+3–>8=81
        ...
    }
    return result;
}


这大概就是我对这道问题的终极解法,真是的计算步骤,简练方便,可移植。而其得出得益于编程思想,而编程思想又反哺于我们的生活。
“编程教给了我另一种思维方式。”——史蒂夫·乔布斯(《遗失的访谈》)

posted @ 2016-03-05 09:01  FontTian  阅读(120)  评论(0编辑  收藏  举报