zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
    

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

  • 相关阅读:
    第二次作业
    第五次作业
    第四次作业
    第三次作业
    第二次作业
    第三次作业
    第二次作业
    第二次作业
    gravity
    card
  • 原文地址:https://www.cnblogs.com/fonttian/p/7148728.html
Copyright © 2011-2022 走看看