leetcode_900 RLE 迭代器

93 阅读2分钟

要求

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

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

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

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

示例:

输入:["RLEIterator","next","next","next","next"], [[[3,8,0,9,2,5]],[2],[1],[1],[2]]
输出:[null,8,8,5,-1]
解释:
RLEIterator 由 RLEIterator([3,8,0,9,2,5]) 初始化。
这映射到序列 [8,8,8,5,5]。
然后调用 RLEIterator.next 4次。

.next(2) 耗去序列的 2 个项,返回 8。现在剩下的序列是 [8, 5, 5].next(1) 耗去序列的 1 个项,返回 8。现在剩下的序列是 [5, 5].next(1) 耗去序列的 1 个项,返回 5。现在剩下的序列是 [5].next(2) 耗去序列的 2 个项,返回 -1。 这是由于第一个被耗去的项是 5,
但第二个项并不存在。由于最后一个要耗去的项不存在,我们返回 -1

提示:

  • 0 <= A.length <= 1000
  • A.length 是偶数。
  • 0 <= A[i] <= 10^9
  • 每个测试用例最多调用 1000 次 RLEIterator.next(int n)。
  • 每次调用 RLEIterator.next(int n) 都有 1 <= n <= 10^9 。

核心代码

class RLEIterator:
    def __init__(self, encoding: List[int]):
        self.lst = []
        for i in range(0,len(encoding),2):
            if encoding[i] > 0:
                self.lst.append([encoding[i + 1],encoding[i]])
        self.lst.reverse()

    def next(self, n: int) -> int:
        while self.lst:
            val,num = self.lst.pop()
            if num < n:
                n -= num
            elif num == n:
                return val
            else:
                num -= n
                self.lst.append([val,num])
                return val
        return -1

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

image.png

解题思路:这种题其实就是读懂题目,然后根据题目构建数据结构,比较简单,思路就是我们将encoding中的数据构造成[val,num]的结构,当我们向外取值的时候,我们先判断要取出的个数和我们[num]中个数的多少,判断是向下走,还是当前就能满足条件,相对比较简单,读懂题目是关键。