编写一个遍历游程编码序列的迭代器。
迭代器由
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]
的游程编码。这是因为该序列可以读作 “三个八,零个九,两个五”。
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)