We can use run-length encoding (i.e., RLE) to encode a sequence of integers. In a run-length encoded array of even length encoding (0-indexed), for all even i, encoding[i] tells us the number of times that the non-negative integer value encoding[i + 1] is repeated in the sequence.
- For example, the sequence
arr = [8,8,8,5,5]can be encoded to beencoding = [3,8,2,5].encoding = [3,8,0,9,2,5]andencoding = [2,8,1,8,2,5]are also valid RLE ofarr.
Given a run-length encoded array, design an iterator that iterates through it.
Implement the RLEIterator class:
RLEIterator(int[] encoded)Initializes the object with the encoded arrayencoded.int next(int n)Exhausts the nextnelements and returns the last element exhausted in this way. If there is no element left to exhaust, return-1instead.
Example 1:
Input ["RLEIterator", "next", "next", "next", "next"] [[[3, 8, 0, 9, 2, 5]], [2], [1], [1], [2]] Output [null, 8, 8, 5, -1] Explanation RLEIterator rLEIterator = new RLEIterator([3, 8, 0, 9, 2, 5]); // This maps to the sequence [8,8,8,5,5]. rLEIterator.next(2); // exhausts 2 terms of the sequence, returning 8. The remaining sequence is now [8, 5, 5]. rLEIterator.next(1); // exhausts 1 term of the sequence, returning 8. The remaining sequence is now [5, 5]. rLEIterator.next(1); // exhausts 1 term of the sequence, returning 5. The remaining sequence is now [5]. rLEIterator.next(2); // exhausts 2 terms, returning -1. This is because the first term exhausted was 5, but the second term did not exist. Since the last term exhausted does not exist, we return -1.
Constraints:
2 <= encoding.length <= 1000encoding.lengthis even.0 <= encoding[i] <= 1091 <= n <= 109- At most
1000calls will be made tonext.
class RLEIterator:
def __init__(self, encoding: List[int]):
self.encoding = encoding
self.i = 0
self.curr = 0
def next(self, n: int) -> int:
while self.i < len(self.encoding):
if self.curr + n > self.encoding[self.i]:
n -= self.encoding[self.i] - self.curr
self.curr = 0
self.i += 2
else:
self.curr += n
return self.encoding[self.i + 1]
return -1
# Your RLEIterator object will be instantiated and called as such:
# obj = RLEIterator(encoding)
# param_1 = obj.next(n)class RLEIterator {
private int[] encoding;
private int curr;
private int i;
public RLEIterator(int[] encoding) {
this.encoding = encoding;
curr = 0;
i = 0;
}
public int next(int n) {
while (i < encoding.length) {
if (curr + n > encoding[i]) {
n -= encoding[i] - curr;
i += 2;
curr = 0;
} else {
curr += n;
return encoding[i + 1];
}
}
return -1;
}
}
/**
* Your RLEIterator object will be instantiated and called as such:
* RLEIterator obj = new RLEIterator(encoding);
* int param_1 = obj.next(n);
*/class RLEIterator {
public:
vector<int> encoding;
int curr;
int i;
RLEIterator(vector<int>& encoding) {
this->encoding = encoding;
this->curr = 0;
this->i = 0;
}
int next(int n) {
while (i < encoding.size()) {
if (curr + n > encoding[i]) {
n -= encoding[i] - curr;
curr = 0;
i += 2;
} else {
curr += n;
return encoding[i + 1];
}
}
return -1;
}
};
/**
* Your RLEIterator object will be instantiated and called as such:
* RLEIterator* obj = new RLEIterator(encoding);
* int param_1 = obj->next(n);
*/type RLEIterator struct {
encoding []int
curr int
i int
}
func Constructor(encoding []int) RLEIterator {
return RLEIterator{encoding: encoding, curr: 0, i: 0}
}
func (this *RLEIterator) Next(n int) int {
for this.i < len(this.encoding) {
if this.curr+n > this.encoding[this.i] {
n -= this.encoding[this.i] - this.curr
this.curr = 0
this.i += 2
} else {
this.curr += n
return this.encoding[this.i+1]
}
}
return -1
}
/**
* Your RLEIterator object will be instantiated and called as such:
* obj := Constructor(encoding);
* param_1 := obj.Next(n);
*/