すべてのチャレンジ
中級 0件解決済み 正答率0%

任意にネストされたリストの平坦化(再帰)

再帰を使って、任意にネストされたリストを平坦化し、null要素をスキップする練習です。

これは「2次元配列の平坦化」の上級編です。まずはそちらの問題に取り組んでください。この問題では、リストが任意の深さでさらにリストを含む場合があります。C++およびC#では、スターターコードにあるNestedValue型を使用してください。まずkindを読み取ります:0はこの要素をスキップ、1は値を追加、2は再帰的に中身を探索します。

ネストされたリストを整数のフラットなリストに変換してください。左から右へ読み進め、別のリストに到達した場合はその中身を先に読みます。null値(例ではNone)や空リストは無視してください。同じ整数やその順序は保持します。

Pythonでは、整数やNoneを含む通常のネストリストが渡されます。C++およびC#では、スターターコードが提供するNestedValueオブジェクトのリストが渡されます:kindが0ならnull、1ならvalueに整数、2ならitemsにリストが入ります。kindで指定されたフィールドのみが有効です。どの言語でも、返り値は整数の通常のリストにしてください。

flatten_arbitrarily_nested_list(values) を実装してください。

入力

values: 要素として整数、null、またはさらにリストを含むリスト。

出力

整数を深さ優先・左から右の順で返してください。整数が1つもなければ空リストを返します。

制約

外側の値はリストです。全てのリストを合わせて最大10,000要素、最大ネスト深さは50です。整数リーフは符号付き64ビットに収まります。リーフは整数またはnullであり、文字列やブール値は含まれません。

例

例 1
入力:
values = [
    1,
    [
        2,
        None,
        [3]
    ],
    [],
    4
]

期待される出力:
expected = [1, 2, 3, 4]

スターターコードで提供されている NestedValue 型を使ってください。フィールドは kind(0 = null、1 = 整数、2 = リスト)、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 = 整数、2 = リスト)、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を読み取り、次にネストされたリストに入り、nullをスキップして2と3を読みます。空リストは何も追加せず、最後に4を読み取ります。

例 2
入力:
values = [
    None,
    [],
    [None]
]

期待される出力:
expected = []

スターターコードで提供されている NestedValue 型を使ってください。フィールドは kind(0 = null、1 = 整数、2 = リスト)、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 = 整数、2 = リスト)、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または空のコンテナです。整数は1つも残りません。

参考資料

この課題はCodeUtility用に調整されています。上記の説明と制約に従ってください。

他の人の解答から学ぶ

コミュニティの解答

まだ公開された解答がありません。この課題を解いて最初の解答を共有しましょう。