面试问题:
我有一个数组:例如这个数组:
a,b,c,d,e,f,g!=0
List_1=[a,b,c,d,e,f,g]
我想找到一种最少运算符的最优方法来找到此结果:
Multiplication=[a+bcdefg,ab+cdefg,abc+defg,abcd+efg,abcde+fg,abcdef+g]
我建议使用这种方法:
mult=a*b*c*d*e*f*g
Multiplication=[]
Temp=List_1[0]
while(i<(len(List_1))-1):
mult/=List_1[i]
Multiplication.append(Temp+mult)
Temp*=List_1[i+1]
此行mult=a*b*c*d*e*f*g
采用$ n-1 $乘法,while
循环采用$(n-1)$乘法,$(n-1)$除法和$(n-1)$加成。因此,总时间约为$ 3n-3 $乘以$(n-1)$加。
这是最简单的方法还是其他方法具有最小的内存和时间?
答案 0 :(得分:3)
首先创建[a, ab, abc, …]
:
l = [a, b, c, d, e, f, g]
result = []
p = 1
for i in range(0, len(l) - 1):
p *= l[i]
result.append(p)
然后将[…, efg, fg, g]
添加到其中:
p = 1
for i in range(len(l) - 1, 0, -1):
p *= l[i]
result[i - 1] += p
这需要2(n-1)个乘法和n-1个列表元素加法,这比2(n-1)个乘法,2(n-1)个除法和n-1个加法好。
这也是Primusa的描述。
答案 1 :(得分:1)
建议不加区分地进行追踪,这要慢得多:
myList=[1,2,3,4,5,6,7,8]
arrLen = len(myList)
leftOp = [1] * arrLen
rightOp = [1] * arrLen
result = [1] * (arrLen - 1)
leftOp[0] = myList[0]
rightOp[arrLen - 1] = myList[arrLen - 1]
for i in range(1, arrLen - 1):
leftOp[i] = myList[i] * leftOp[i-1]
rightOp[arrLen - 1 - i] = myList[arrLen - 1 - i] * rightOp[arrLen - i]
for i in range(0, arrLen - 1):
result[i] = leftOp[i] + rightOp[i + 1]