Это продвинутое продолжение задачи "Преобразование двумерного массива в плоский". Сначала выполните ту задачу. Здесь списки могут содержать другие списки на любой глубине. В C++ и C# используйте тип NestedValue из стартового кода. Сначала читайте поле kind: 0 — пропустить элемент, 1 — добавить значение, 2 — рекурсивно обработать элементы.
Преобразуйте вложенный список в плоский список целых чисел. Читайте слева направо; при встрече вложенного списка сначала обработайте его содержимое, затем продолжайте. Игнорируйте null-значения (в примерах обозначены как None) и пустые списки. Сохраняйте повторяющиеся числа и их порядок.
В Python на вход подаются обычные вложенные списки, содержащие целые числа и None. В C++ и C# на вход подается список объектов NestedValue из шаблона: kind 0 — null, kind 1 — целое число в поле value, kind 2 — список в поле items. Значение имеет только поле, соответствующее kind. Во всех языках возвращайте обычный список целых чисел.
Реализуйте функцию flatten_arbitrarily_nested_list(values).
Входные данные
values: Список, элементы которого могут быть целыми числами, null или вложенными списками.
Выходные данные
Верните целые числа в порядке обхода в глубину слева направо. Если целых чисел нет, верните пустой список.
Ограничения
Внешнее значение — список. Не более 10 000 элементов во всех списках вместе; максимальная глубина вложенности — 50. Листовые значения — целые числа, помещающиеся в знаковый 64-битный тип. Листовые элементы — только целые числа или null, никогда не строки и не булевы значения.
Примеры
Ввод:
values = [
1,
[
2,
None,
[3]
],
[],
4
]
Ожидаемый вывод:
expected = [1, 2, 3, 4]
Используйте тип NestedValue из стартового кода. Его поля: kind (0 = null, 1 = integer, 2 = list), value (целое число) и items (вложенный список).
Ввод:
std::vector<NestedValue> values = {
NestedValue{1, 1, {}},
NestedValue{2, 0, {
NestedValue{1, 2, {}},
NestedValue{0, 0, {}},
NestedValue{2, 0, {
NestedValue{1, 3, {}}
}}
}},
NestedValue{2, 0, {}},
NestedValue{1, 4, {}}
};
Ожидаемый вывод:
std::vector<long long> expected = {1, 2, 3, 4};
Используйте тип NestedValue из стартового кода. Его поля: kind (0 = null, 1 = integer, 2 = list), value (целое число) и items (вложенный список).
Ввод:
NestedValue[] values = new NestedValue[] {
new NestedValue { kind = 1, value = 1 },
new NestedValue { kind = 2, items = new NestedValue[] {
new NestedValue { kind = 1, value = 2 },
new NestedValue { kind = 0 },
new NestedValue { kind = 2, items = new NestedValue[] {
new NestedValue { kind = 1, value = 3 }
} }
} },
new NestedValue { kind = 2, items = new NestedValue[] {} },
new NestedValue { kind = 1, value = 4 }
};
Ожидаемый вывод:
long[] expected = new long[] {1, 2, 3, 4};
Пояснение
Сначала читаем 1, затем переходим во вложенный список и читаем 2 и 3, пропуская null. Пустой список ничего не добавляет; завершаем 4.
Ввод:
values = [
None,
[],
[None]
]
Ожидаемый вывод:
expected = []
Используйте тип NestedValue из стартового кода. Его поля: kind (0 = null, 1 = integer, 2 = list), value (целое число) и items (вложенный список).
Ввод:
std::vector<NestedValue> values = {
NestedValue{0, 0, {}},
NestedValue{2, 0, {}},
NestedValue{2, 0, {
NestedValue{0, 0, {}}
}}
};
Ожидаемый вывод:
std::vector<long long> expected = {};
Используйте тип NestedValue из стартового кода. Его поля: kind (0 = null, 1 = integer, 2 = list), value (целое число) и items (вложенный список).
Ввод:
NestedValue[] values = new NestedValue[] {
new NestedValue { kind = 0 },
new NestedValue { kind = 2, items = new NestedValue[] {} },
new NestedValue { kind = 2, items = new NestedValue[] {
new NestedValue { kind = 0 }
} }
};
Ожидаемый вывод:
long[] expected = new long[] {};
Пояснение
Каждый элемент — либо null, либо пустой контейнер. Целых чисел не осталось.
Ссылки
Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.