番号と値を全部 XOR でまとめ、0 から n の中で抜けた数を見つける

0 から n までの n + 1 個の数のうち、1 つだけが抜けた長さ n の並びから、抜けた数を返します。0 から n の番号と並びの値を全部 XOR でまとめれば、そろった数は打ち消し合って抜けた数だけが残る練習です。

海外で定番の問題リスト 4 本には入っていません

問題

イベントの受付で、0 から n までの整理券を 1 枚ずつ配りました。回収した整理券の番号が、長さ n の並び nums で渡されます。n + 1 枚のうち 1 枚だけが戻っていません。戻っていない番号を返す関数を書いてください。

  • nums の値はどれも 0 以上 n 以下で、同じ値は 2 回出てきません。並び順はばらばらです
  • 時間は O(n)、追加の記憶は O(1) を目指してください
  • n は 1 以上 10000 以下です

入力と出力の例

例 1

0 から 5 のうち、2 がありません。

nums = [4, 0, 5, 1, 3]
2

例 2

いちばん大きい n が抜けることもあります。0 から 4 のうち、4 がありません。

nums = [2, 3, 0, 1]
4

例 3

0 が抜けることもあります。

nums = [1]
0

面接での聞かれ方

面接では、短い問題に何通りもの解き方がある問題として出されます。

  • 「0 から n のうち、抜けている 1 つの数を返してください」
  • 集合や並べ替えの書き方を見せると、「追加の記憶 O(1)、時間 O(n) でできますか?」と続きます
  • 和で解く書き方を見せると、「n がとても大きいと、和はあふれませんか?」と聞かれることがあります

いくつかの書き方を比べ、それぞれの弱いところを言えるかが見られています。

ヒント

まだ開いていません

付箋は 3 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3答えに近い

アルゴリズムのチートシートの「配列と文字列」に、この型の要点を表とコードでまとめています。

配列と文字列の問題は、全部の組を調べると手間が大きくなる所を、窓や左右の添字で減らす形が多いです。

main.py
def missing_number(nums: list[int]) -> int:
    """
    Goal: 何を返すか

    idea1: まず思いつく案
    -> runtime: O(?)  space: O(?)

    idea2: もっと速い案
    -> runtime: O(?)  space: O(?)

    edge case: 空、1 つだけ、など
    """
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
print(missing_number([4, 0, 5, 1, 3]))

できているか「例で確かめる」を押すと、問題の例を全部この関数に渡して、通ったかをここに出します