1. 程式人生 > >每個程式設計師1小時內必須解決的5個程式設計問題之難題

每個程式設計師1小時內必須解決的5個程式設計問題之難題

昨天看到一篇文章說,軟體開發人員應一小時完成的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 深圳