题目描述:
题解:
解法1(未通过):
最开始把这个题目想的简单了, 通过list实现,add操作对应list的append操作,productOfNumbers则将list最后k个元素相乘返回乘积。
class ProductOfNumbers(object): def __init__(self): self.numlist = [] def add(self, num): self.numlist.append(num) def getProduct(self, k): res = 1 for i in range(1,k+1): if self.numlist[-i]==0: return 0 res = res*self.numlist[-i] return res
解法二(通过):
1.ProductOfNumbers中定义三个元素:
prefix为一个列表,prefix[i]表示0-i个元素之积。
zero_idx记录列表中最后一个0的位置,初始化为0
idx记录当前列表中元素数量
2.add操作(同时对prefix进行更新)
<1>如果添加的num为0,则将prefix中该位置之前所有元素之积设为1,zero_idx更新为idx
<2>如果num不为0,如果不是第一次add操作(idx!=0),即prefix和列表均不为空,prefix中该位置之前所有元素之积=prefix[-1]*num。如果是添加的第一个元素(idx==0),则直接将num加入prefix
<3>idx+1
3.getproduct操作(根据prefix)
1.prefix[i]表示列表中第0-i个元素之积,因此列表中后k个元素之积=prefix[-1]/prefix[-k-1]即最后k个数之积=所有树之积/除去这k个数外所有数之积。
2.如果这k个数中有0,则直接返回0。
3.如果k=len(prefix),返回prefix[-1]
参考:LeetCode-Python-1352. 最后 K 个数的乘积 (前缀积 + 数组)_Keep Coding-CSDN博客
class ProductOfNumbers(object): def __init__(self): self.prefix = [] self.zero_idx = -1 self.idx = 0 def add(self, num): if num!=0: if self.idx: self.prefix.append(self.prefix[-1] * num) else: self.prefix.append(num) else: self.zero_idx = self.idx self.prefix.append(1) self.idx = self.idx+1 def getProduct(self, k): if self.zero_idx>=len(self.prefix)-k: return 0 elif k==self.idx: return self.prefix[-1] else: return self.prefix[-1]/self.prefix[-k-1]