Leetcode Algorithm No.241 Different Ways to Add Parentheses

4101 ワード

Pythonの浅いコピーを初めて知った
テーマはLeetcodeから
Given a string of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. The valid operators are  +-  and  * .
Example 1
Input:  "2-1-1" .
((2-1)-1) = 0
(2-(1-1)) = 2

Output:  [0, 2]
Example 2
Input:  "2*3-4*5"
(2*(3-(4*5))) = -34
((2*3)-(4*5)) = -14
((2*(3-4))*5) = -10
(2*((3-4)*5)) = -10
(((2*3)-4)*5) = 10

Output:  [-34, -14, -10, -10, 10]
Program language: Python 3.4
正常に実行された第Nバージョンでは、期待される結果は得られませんでした.
'''calculat      +,-,*    ,      calculat([1,2],'+'),   3'''
def calculat(value,oper):
    #print(input)
    result = 0
    if len(oper) == 1:
        a = value[0]
        b = value[1]
        if oper[0] == '+':
            result = (a+b)
        elif oper[0] == '-':
            result = (a-b)
        elif oper[0] == '*':
            result = (a*b)
    return result
'''itercalculate    list,value       ,oper        ,value    oper 1
          '''
def itercalculate(value,oper,out=[]):
    if len(oper) == 1:
        out.append(calculat(value,oper))
        return out
    else:
        i=0
        while i<len(oper):            
            print ('before del',value,oper,i)
            result = calculat(value[i:i+2],oper[i])
            subvalue = value
            suboper = oper
            print (id(value),' ' , id(oper))
            print (id(subvalue),' ' , id(suboper))
            '''          id  value subvalue        ,      ,
    ,    subvalue = value      ,            subvalue  ,   
subvalue           value'''
            subvalue[i] = result
            del subvalue[i+1]
            del suboper[i]           
            itercalculate(subvalue,suboper)
            i=i+1 

'''diffWaysToCompute              ,              list :value
 operator.
        "2*3-4*5",        value=[2,3,4,5],oper=[*,-,*]
      itercalculate, value operator    ,               '''          
def diffWaysToCompute(input,out):
    i=0
    value = []
    operator = []
    while i<len(input):
        if i%2 == 0:            
            value.append(int(input[i]))
        else:
            operator.append(input[i])
        i=i+1
    out=itercalculate(value,operator,out)
    return out    
s="2*3-4*5"
out=[]
diffWaysToCompute(s,out)
print('    : ',out)
'''
     :
>>> 
before del [2, 3, 4, 5] ['*', '-', '*'] 0
58214280   58213680
58214280   58213680
before del [6, 4, 5] ['-', '*'] 0
58214280   58213680
58214280   58213680
    :  None
'''
'''
itercalculate     while       del     subvalue   suboper     。
del         value  oper            。
    subvalue   suboper del    value  oper     。
       。
'''

上記の問題に鑑みてitercalculate関数を更新しdelコマンドを使用しない
'''
 diffWaysToCompute              ,              list 。
                 
'''
def itercalculate(value,oper,out):
    if len(oper) == 1:
        out.append(calculat(value,oper))
        return out
    else:
        i=0
        while i<len(oper):                       
            result = calculat(value[i:i+2],oper[i])
            if i==0:
                subvalue = value[1:]
                suboper = oper[1:]
            elif i==len(oper)-1:
                subvalue = value[0:i+1]
                suboper = oper[0:i]
            else:
                subvalue = value[0:i+1] + value[i+2:]
                suboper = oper[0:i] + oper[i+1:]
            subvalue[i] = result
            itercalculate(subvalue,suboper,out)
            i=i+1           

期待結果を出力:
>>> [10, -14, -10, -10, -14, -34]