C ++中的RLE迭代器
假设我们必须创建一个迭代器,该迭代器遍历游程编码序列。此处,迭代器通过调用RLEIterator(int[]A)进行初始化,其中A是序列的游程长度编码。因此我们可以说,对于所有偶数i,A[i]告诉我们在序列中重复非负整数值A[i+1]的次数。这里的迭代器支持一个功能-
next(intn):此函数将耗尽接下来的n个元素(n>=1),并返回以此方式耗尽的最后一个元素。因此,如果没有剩余要用尽的元素,则next返回-1。
假设我们从A=[3,8,0,9,2,5]开始,它是序列[8,8,8,5,5]的行程编码。这样做是因为该序列可以读为“三八,零九,二五”。因此,在用A初始化它们之后,如果我们调用next(2),next(1),next(1),next(2),则最终结果将是[8,8,5,-1]。
为了解决这个问题,我们将遵循以下步骤-
在初始化程序中,将数组初始化为A,然后设置index:=0
在next()方法中,将n作为输入。这将如下工作
而索引<A的大小和n>A[索引]
n:=n–A[index],并将索引增加2
如果索引>数组A的大小,则返回-1
A[index]:=A[index]–n
返回A[索引+1]
让我们看下面的实现以更好地理解-
示例
#include <bits/stdc++.h> using namespace std; class RLEIterator { public: vector <int> A; int idx = 0; RLEIterator(vector<int>& A) { this->A = A; idx = 0; } int next(int n) { while(idx < A.size() && n > A[idx]){ n -= A[idx]; idx += 2; } if(idx >= A.size()) return -1; A[idx] = A[idx] - n; return A[idx + 1]; } }; main(){ vector<int> v = {3,8,0,9,2,5}; RLEIterator ob(v); cout << (ob.next(2)) << endl; cout << (ob.next(1)) << endl; cout << (ob.next(1)) << endl; cout << (ob.next(2)) << endl; }
输入值
Initialize with [3,8,0,9,2,5] and call next(2), next(1), next(1), next(2)
输出结果
8 8 5 -1