IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]每个程序员1小时内必须解决的5个编程问题之难题

    caimouse发表于 2015-05-13 14:02:39
    love 0
    昨天看到一篇文章说,软件开发人员应一小时完成的5道题,其中第5道题,还是比较难的。看了一下作者的原来解题思路,就是采用治减法,这是一类问题的算法题,如果没有接触过,确实有点难度。作者提供了JAVA的源码,由于我没有JAVA的运行环境,不能执行,只好改为Python的方式,顺便熟悉Python,运行了一下,递归的方法是简单,并且容易理解它,但如果自己没有去写一下,调试一下,理解起来还是有困难的。


    代码如下:

    #python 3.4.3  win7
    #问题5
    #编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,
    #并输出所有的可能性。例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100。
    
    #数字序列
    NumList = [x for x in range(1,10)]
    #目标值
    TARGET_SUM = 100
    
    #添加一个数字到表达式字符串
    def add(digit, sign, branches):   
        tempL = branches  #采用临时列表,防止原地修改     
        for x in range(len(tempL)):                
            tempL[x] = str(digit) + sign + tempL[x]    
        
        return tempL
        
    #递归函数实现分治算法。
    def fun(sum, number, index):
        digit = abs(number) % 10
        #递归跳出条件
        if index >= len(NumList):
            if sum == number:            
                return [str(digit)]
            return []
    
        #三个按算法要求的分支递归
        branch1 = fun(sum - number, NumList[index], index + 1)
        branch2 = fun(sum - number, -NumList[index], index + 1)
    
        conNum = 0
        if number < 0:
            conNum = number * 10 - NumList[index]
        else:
            conNum = number * 10 + NumList[index]    
        branch3 = fun(sum, conNum, index + 1)
    
        #保存递归结果到列表
        L = []
        L.extend(add(digit, '+', branch1))
        L.extend(add(digit, '-', branch2))
        L.extend(add(digit, '', branch3))
        
        return L;
    
    #
    if __name__ == "__main__":    
        for x in fun(TARGET_SUM, NumList[0], 1):
            print(x)
    

    运行结果如下:
    >>>
    1+2+3-4+5+6+78+9
    1+2+34-5+67-8+9
    1+23-4+5+6+78-9
    1+23-4+56+7+8+9
    12+3+4+5-6-7+89
    12+3-4+5+67+8+9
    12-3-4+5-6+7+89
    123+4-5+67-89
    123+45-67+8-9
    123-4-5-6-7+8-9
    123-45-67+89
    >>>


    相关文章的连接:
    每个程序员1小时内必须解决的5个编程问题
    http://www.codeceo.com/article/5-problems-programmer-1-hour.html
    https://blog.svpino.com/2015/05/07/five-programming-problems-every-software-engineer-should-be-able-to-solve-in-less-than-1-hour
    https://blog.svpino.com/2015/05/08/solution-to-problem-5-and-some-other-thoughts-about-this-type-of-questions



    蔡军生 QQ:9073204 深圳



沪ICP备19023445号-2号
友情链接