Custom Iterator
Задача: дан вложенный список целых чисел NestedList:
- каждый элемент представляет собой целое число или список, элементы которого также могут быть целыми числами или другими списками.
Необходимо реализовать итератор CustomIterator:
класс CustomIterator:
- CustomIterator(List<NestedInteger> nestedList) — конструктор, ктр инициализирует итератор вложенным списком nestedList.
- int Next() — метод класса, ктр возвращает следующее целое число во вложенном списке.
- boolean hasNext() — метод, ктр возвращает true, если во вложенном списке все еще есть целые числа, и false в противном случае.
Примеры:
- NestedList = [[1, 1], 2, [1, 1]]
Output: [1, 1, 2, 1, 1] - NestedList = [1, [4, [6]]]
Output: [1, 4, 6]
Разбор
Самый простой способ решить эту задачу — это превратить вложенный список в обычный одномерный список. Как это сделать?!
Можно воспользоваться рекурсией: будем проходит по вложенному списку и добавлять в результирущий массив элемент, если это простое число, если же мы встретили вложенный список, то вызываем рекурсию с этим списком.
Таким образом по окончанию основного цикла в результирующем массиве мы получим все элементы, порядок элементов также сохраниться, т.к. мы проходим слева направо.
Далее все просто: мы просто заведем глобальную переменную, которая будет следить за позицией текущего элемента в итераторе. Эту переменную используем в методах HasNext и Next.
Детали реализации смотрите в коде!
Реализация
https://gist.github.com/unilecs/669e9ee2fcdd8c1d8d719d8d1bd8bbce