【Leetcode】900. RLE 迭代器

编写一个遍历游程编码序列的迭代器。

迭代器由 RLEIterator(int[] A) 初始化,其中 A 是某个序列的游程编码。更具体地,对于所有偶数 iA[i] 告诉我们在序列中重复非负整数值 A[i + 1] 的次数。

迭代器支持一个函数:next(int n),它耗尽接下来的  n 个元素(n >= 1)并返回以这种方式耗去的最后一个元素。如果没有剩余的元素可供耗尽,则  next 返回 -1 。

例如,我们以 A = [3,8,0,9,2,5] 开始,这是序列 [8,8,8,5,5] 的游程编码。这是因为该序列可以读作 “三个八,零个九,两个五”。

    Weekly Contest.99的第一道题,一开始的想法就是把整个序列打印出来,然后根据每一次查询来返回值,然而事实上证明我还是太young了(肯定会爆掉)。所以,倒不如把整个A序列的编码数量进行处理了,然后根据查询,看查询的index是否小于某个数的编码数量,如果大于前一个数的数量,小于后一个数的数量,那就只需返回后一个数就好了,不过要是index大于所有的编码数量了,那肯定就得返回-1了,而且查询的index越来越大,如果后面还要查询,也是直接返回-1,下面是图解,可能比较好看一点:

class RLEIterator:

    def __init__(self, A):
        """
        :type A: List[int]
        """
        self.A = A
        for i in range(2, len(self.A), 2):
            self.A[i] += self.A[i - 2]
        self.pre_index = 0
        self.i = 0

    def next(self, n):
        """
        :type n: int
        :rtype: int
        """
        self.pre_index += n # 对每一次查询进行更新
        while self.i < len(self.A):
            if self.A[self.i] >= self.pre_index:
                return self.A[self.i + 1]
            else:
                self.i += 2 # 遍历接下来的游码数量
        if self.i >= len(self.A):
            return -1


# Your RLEIterator object will be instantiated and called as such:
# obj = RLEIterator(A)
# param_1 = obj.next(n)

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值