Сложность: medium
Для кодирования последовательности целых чисел мы можем использовать кодирование по длине строки (т. е. RLE). В кодированном по длине пробега массиве четной длины (с индексацией 0) для всех четных i значение encoding[i] говорит нам о том, сколько раз неотрицательное целое значение encoding[i + 1] повторяется в последовательности.
Например, последовательность arr = [8,8,8,5,5] может быть закодирована как encoding = [3,8,2,5]. encoding = [3,8,0,9,2,5] и encoding = [2,8,1,8,2,5] также являются допустимыми RLE для arr.
Задав кодированный по длине пробега массив, разработайте итератор для его итерации. Реализуйте класс RLEIterator: RLEIterator(int[] encoded) Инициализирует объект с кодированным массивом encoded. int next(int n) Исчерпывает следующие n элементов и возвращает последний исчерпанный таким образом элемент. Если не осталось элементов для исчерпания, возвращает -1.
Пример:
Input
["RLEIterator", "next", "next", "next", "next"]
[[[3, 8, 0, 9, 2, 5]], [2], [1], [1], [2]]
Output
[null, 8, 8, 5, -1]
👨💻 Алгоритм:
1⃣Инициализировать итератор с закодированным массивом и индексом, указывающим на текущую позицию.
2⃣При вызове метода next(n), уменьшить текущий счетчик на n или перейти к следующему числу, если текущий счетчик равен нулю.
3⃣Возвращать текущий элемент или -1, если все элементы исчерпаны.
😎 Решение:
var RLEIterator = function(encoding) {
this.encoding = encoding;
this.index = 0;
};
RLEIterator.prototype.next = function(n) {
while (this.index < this.encoding.length) {
if (n > this.encoding[this.index]) {
n -= this.encoding[this.index];
this.index += 2;
} else {
this.encoding[this.index] -= n;
return this.encoding[this.index + 1];
}
}
return -1;
};Ставь 👍 и забирай 📚 Базу знаний