zoukankan      html  css  js  c++  java
  • 98%的人没解出的德国面试逻辑题

    之前在某网站上看过一个号称“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;
    }
    
    
    

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

  • 相关阅读:
    bzoj 1176 cdq分治套树状数组
    Codeforces 669E cdq分治
    Codeforces 1101D 点分治
    Codeforces 1100E 拓扑排序
    Codeforces 1188D Make Equal DP
    Codeforces 1188A 构造
    Codeforces 1188B 式子转化
    Codeforces 1188C DP 鸽巢原理
    Codeforces 1179D 树形DP 斜率优化
    git commit -m "XX"报错 pre -commit hook failed (add --no-verify to bypass)问题
  • 原文地址:https://www.cnblogs.com/fonttian/p/9162877.html
Copyright © 2011-2022 走看看