番号と 値を 全部 XOR で まとめ、 0 から n の 中で 抜けた 数を見つける
0 から
海外で定番の問題リスト 4 本には入っていません
問題
イベントのnums で
numsの値は どれも 0 以上 n 以下で、 同じ値は 2 回出てきません。 並び順は ばらばらです - 時間は O(n)、
追加の 記憶は O(1) を 目指してください - n は 1 以上 10000 以下です
入力と出力の例
例 1
0 から 5 の
例 2
いちばん
例 3
0 が
面接での聞かれ方
面接では、
- 「0 から n の
うち、 抜けている 1 つの 数を 返してください」 - 集合や
並べ替えの 書き方を 見せると、 「追加の 記憶 O(1)、 時間 O(n) で できますか?」と続きます - 和で
解く 書き方を 見せると、 「n が とても 大きいと、 和は あふれませんか?」と 聞かれる ことがあります
いく
ヒント
まだ開いていません
付箋は 3 枚。下の段ほど答えに近づきます
ヒント 2
ヒント 3答えに近い
アルゴリズムのチートシートの「配列と文字列」に、
関わる学び
配列と
まず 考える手順
段 1
まずは
段 2
0 から n の
段 3
XOR を
解答
Python
Python
def missing_number(nums):
n = len(nums)
acc = n
for i, v in enumerate(nums):
acc ^= i ^ v
return accJavaScript
JavaScript
function missingNumber(nums) {
const n = nums.length;
let acc = n;
for (let i = 0; i < n; i++) {
acc ^= i ^ nums[i];
}
return acc;
}Go
Go
func missingNumber(nums []int) int {
n := len(nums)
acc := n
for i, v := range nums {
acc ^= i ^ v
}
return acc
}acc を n から
計算量
- 時間は O(n) です。
並びを 1 回なめます - 追加の
記憶は O(1) です - 和で
解く 書き方も 時間 O(n)、 記憶 O(1) です。 この 問題の n の 範囲なら和は あふれませんが、 XOR は どんな 大きさでも あふれません
よく ある間違い
- n の
分を 足し忘れる。 添え字は 0 から n - 1 までなので、 accを 0 から始めると 番号 n が 入りません。 例 2 で、 抜けた 4 の 代わりに 0 を 返してしまいます - 並びが
並べ替え済みだと 思い込む。 例 1 のように 並びは ばらばらです。 「i 番目が i でない所」を 探す 書き方は、 並べ替えてからでないと 使えません - 和の
書き方であふれを 無視する。 n が 10 万を 超える 場面で、 32 ビットの 整数で n(n + 1) を 先に 計算すると、 あふれて 答えが狂います
解答を動かした版 Python 3.14.7Node.js 24.22.1Go 1.24.2確認日 2026年11月8日
面接での 話し方の例
書き始める
「0 から n までの
番号と、 並びの 値を 全部 XOR で まとめます。 両方に 出てくる数は 打ち消し合って 0 に なり、 番号にだけある 抜けた 数が 残ります。 添え字で 0 から n - 1 を まかない、 n は 最初に 入れておきます。 時間は O(n)、 追加の 記憶は O(1) で、 和の 書き方と 違ってあふれも 気にしなくて 済みます。」
書き終えたら、
「例 2 の
[2, 3, 0, 1]では、番号は 0、 1、 2、 3 と 最初に 入れた 4 で、 値は 2、 3、 0、 1 です。 0 から 3 は 両方に 1 回ずつ 出てくるので 消え、 残るのは 4 です。」