python数据结构与算法练习-队列
最后 K 个数的乘积
链接: link
请你实现一个「数字乘积类」ProductOfNumbers,要求支持下述两种方法:
- add(int num)
将数字 num 添加到当前数字列表的最后面。
2. getProduct(int k)
返回当前数字列表中,最后 k 个数字的乘积。
你可以假设当前列表中始终 至少 包含 k 个数字。
题目数据保证:任何时候,任一连续数字序列的乘积都在 32-bit 整数范围内,不会溢出。
示例:
输入:
["ProductOfNumbers","add","add","add","add","add","getProduct","getProduct","getProduct","add","getProduct"]
[[],[3],[0],[2],[5],[4],[2],[3],[4],[8],[2]]
输出:
[null,null,null,null,null,null,20,40,0,null,32]
解释:
ProductOfNumbers productOfNumbers = new ProductOfNumbers();
productOfNumbers.add(3); // [3]
productOfNumbers.add(0); // [3,0]
productOfNumbers.add(2); // [3,0,2]
productOfNumbers.add(5); // [3,0,2,5]
productOfNumbers.add(4); // [3,0,2,5,4]
productOfNumbers.getProduct(2); // 返回 20 。最后 2 个数字的乘积是 5 * 4 = 20
productOfNumbers.getProduct(3); // 返回 40 。最后 3 个数字的乘积是 2 * 5 * 4 = 40
productOfNumbers.getProduct(4); // 返回 0 。最后 4 个数字的乘积是 0 * 2 * 5 * 4 = 0
productOfNumbers.add(8); // [3,0,2,5,4,8]
productOfNumbers.getProduct(2); // 返回 32 。最后 2 个数字的乘积是 4 * 8 = 32
思路:
对于两个问题可以分两个队列或者列表实现,官网优解里采用一个列表的情况没看明白,这里说一下采用两个列表的情况:
- 乘积列表要注意输入数字一旦出现0的时候列表必须重置为[1];
- 从乘积列表获取乘积时,要对k进行判断如果k>列表长度说明出现倒数k个数里必有0,结果也肯定是返回0;如果k<列表长度,那么返回了-1位置与(-k-1)位置整除即可。
from collections import deque
class ProductOfNumbers:
def __init__(self):
self.data = deque()#存放加入的数字
self.multi = [1]#存放加入的数字
def add(self, num: int) -> None:
self.data.append(num) #实现添加功能
'''
这里实现乘积计算 但是要注意:乘积计算肯定是先给输入n个数 数字里如果有0时候,
那么0之后的乘积要视为之后的数与1的乘积 所以有0时候这里要重置列表为1
'''
if num == 0:
self.multi = [1]
else:
self.multi.append(self.multi[-1]*num)
def getProduct(self, k: int) -> int:
'''
这里的判断也很重要 因为如何k>乘积列表的长度说明 倒数k个数字里肯定有0所以直接返回0
如果小于的话,直接返回与-k-1位置的整除即可
'''
if k >= len(self.multi):
return 0
else:
return self.multi[-1] // self.multi[-k-1]
官网有更优解法,这里仅供自己复习使用,也欢迎批评指正。