题目:给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)
from functools import reduce
class Solution:
def multiply(self, A):
# write Bode here
B=[] #定义空列表
n=len(A)
#reduce(f,list(x)):f函数分别作用于list(x)内的值,把结果和序列的下一个元素做累积计算
#lambda 匿名函数,在这里使用 可以实现函数
# 这里不能使用lambda x:x,虽然lambda x:x可以返回一个x值,最开始的逻辑是函数返回x,继续和序列内元素作累积计算
#但累积是需要两个值进行运算的,所以lambda需接受两个输入,一个输出
B.insert(0,reduce(lambda x,y:x*y , A[1:n])) #对于空列表,需用insert()方法往列表中添加数据,不能直接B[0],否则会报list assignment index out of range错误
for i in range(1,n-1): #利用循环,遍历添加B数组
#将B[i]的值分为两部分,A[0:i]和A[i+1:n],分别计算两者的乘积,再算出B[i]的值
#A[0:i]表示从0开始,直到i但不包括i,所以实际上是i-1
B_1=reduce(lambda x,y:x*y,A[0:i])
B_2=reduce(lambda x,y:x*y,A[i+1:n])
B.insert(i,B_1*B_2)
B.insert(n-1,reduce(lambda x, y: x * y, A[0:n - 1])) #算出B[n-1]
print(B)
Solution().multiply([1,2,3,4,5])
另一种解法:
def other_multiply(self,A):
B=[]
n=len(A)
if n==0: #如果A为空,则直接返回
return B
for i in range(n): #外层循环控制B列表的遍历
Bi=1
temp=A[i] #存储A[i]的值
A[i]=1 #每次计算B[i]的值时都没有A[i]参与计算,所以可以把它当为1
for j in A:
Bi *= j
B.append(Bi)
A[i]=temp
return B
知识点:reduce()、lambda匿名函数、切片、空列表操作