python数据结构与算法练习-最后 K 个数的乘积

python数据结构与算法练习-队列

最后 K 个数的乘积

链接: link

请你实现一个「数字乘积类」ProductOfNumbers,要求支持下述两种方法:

  1. 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 

思路:
对于两个问题可以分两个队列或者列表实现,官网优解里采用一个列表的情况没看明白,这里说一下采用两个列表的情况:

  1. 乘积列表要注意输入数字一旦出现0的时候列表必须重置为[1];
  2. 从乘积列表获取乘积时,要对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]

官网有更优解法,这里仅供自己复习使用,也欢迎批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值