Сложность: medium
Даны два вектора целых чисел v1 и v2, реализуйте итератор, который возвращает их элементы поочередно.
Реализуйте класс ZigzagIterator:
ZigzagIterator(List<int> v1, List<int> v2) инициализирует объект с двумя векторами v1 и v2.
boolean hasNext() возвращает true, если в итераторе еще есть элементы, и false в противном случае.
int next() возвращает текущий элемент итератора и перемещает итератор к следующему элементу.
Пример:
Input: v1 = [1,2], v2 = [3,4,5,6]
Output: [1,3,2,4,5,6]
Explanation: By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1,3,2,4,5,6].
👨💻 Алгоритм:
1⃣Инициализация объекта:
Создайте класс ZigzagIterator с двумя списками v1 и v2. Сохраните эти списки в структуре vectors.
Инициализируйте очередь queue, содержащую пары индексов: индекс списка и индекс элемента в этом списке, если список не пуст.
2⃣Метод next:
Удалите первую пару индексов из очереди.
Извлеките элемент из соответствующего списка по указанным индексам.
Если в текущем списке есть еще элементы, добавьте новую пару индексов (тот же список, следующий элемент) в конец очереди.
Верните извлеченный элемент.
3⃣Метод hasNext:
Проверьте, пуста ли очередь.
Верните true, если в очереди есть элементы, и false в противном случае.
😎 Решение:
class ZigzagIterator {
private $vectors = [];
private $queue = [];
public function __construct($v1, $v2) {
$this->vectors[] = $v1;
$this->vectors[] = $v2;
foreach ($this->vectors as $index => $vec) {
if (count($vec) > 0) {
$this->queue[] = [$index, 0];
}
}
}
public function next() {
list($vecIndex, $elemIndex) = array_shift($this->queue);
$nextElemIndex = $elemIndex + 1;
if ($nextElemIndex < count($this->vectors[$vecIndex])) {
$this->queue[] = [$vecIndex, $nextElemIndex];
}
return $this->vectors[$vecIndex][$elemIndex];
}
public function hasNext() {
return count($this->queue) > 0;
}
}Ставь 👍 и забирай 📚 Базу знаний
