Все задачи
Средне Решено: 0 Процент решений: 0%

Преобразование произвольно вложенных списков в плоский (Рекурсия)

Попрактикуйтесь в рекурсии, преобразуя произвольно вложенные списки в плоский, пропуская null-элементы.

Это продвинутое продолжение задачи "Преобразование двумерного массива в плоский". Сначала выполните ту задачу. Здесь списки могут содержать другие списки на любой глубине. В 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, никогда не строки и не булевы значения.

Примеры

Пример 1
Ввод:
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.

Пример 2
Ввод:
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. Следуйте условию и ограничениям выше.

Учитесь у других

Решения сообщества

Пока нет опубликованных решений. Решите задание, чтобы поделиться первым.