全部を XOR で まとめ、 1 回だけ 出てくる 値を見つける
1 つを
海外で定番の問題リスト 4 本には入っていません
問題
靴のnums を
- 時間は O(n)、
追加の 記憶は O(1) を 目指してください numsの長さは 1 以上 30000 以下の 奇数、 値は どれも -30000 以上 30000 以下です
入力と出力の例
例 1
例 2
並びが 1 つだけなら、
例 3
負の
面接での聞かれ方
面接では、
- 「1 つだけ対に
なっていない 数を 返してください」 - 辞書で
数える 書き方を 見せると、 「追加の 記憶を 使わずに できますか?」と続きます - 「3
回ずつ 出てくる 中から 1 つを 探すなら?」と、 続きを 聞かれる こともあります
XOR の
ヒント
まだ開いていません
付箋は 3 枚。下の段ほど答えに近づきます
ヒント 2
ヒント 3答えに近い
アルゴリズムのチートシートの「配列と文字列」に、
関わる学び
配列と
まず 考える手順
段 1
まずは
段 2
XOR (排他的論理和) は、
段 3
並びの
解答
Python
Python
def single_number(nums):
acc = 0
for v in nums:
acc ^= v
return accJavaScript
JavaScript
function singleNumber(nums) {
let acc = 0;
for (const v of nums) {
acc ^= v;
}
return acc;
}Go
Go
func singleNumber(nums []int) int {
acc := 0
for _, v := range nums {
acc ^= v
}
return acc
}負の
計算量
- 時間は O(n) です。
並びを 1 回なめます - 追加の
記憶は O(1) です。 accだけです - 辞書で
数える 書き方は 時間は 同じ O(n) で、 記憶が O(n) に なります。 並べ替えて 隣どうしを 比べる 書き方は、 記憶を 減らせても 時間が O(n log n) です
よく ある間違い
- 全部を
足して引く。 「違う 値の 和の 2 倍から 全部の 和を 引く」 書き方は、 違う 値を 集める 集合に O(n) の 記憶が要ります - 並べ替えて 2 つずつ
比べ、 末尾を 見落とす。 並べ替えると 対が 隣どうしに 並びますが、 1 回だけの 値が いちばん 大きいと 末尾に 残り、 比べる 相手が いません。 ループの 後で 末尾を 返し忘れが ちで、 時間も O(n log n) に増えます - XOR と
累乗を 取り違える。 言語に よって ^の意味が 違います。 Python、 JavaScript、 Go の ^は XOR ですが、数式の 累乗の つもりで 読まない よう、 面接では 「XOR です」と 口に出します
解答を動かした版 Python 3.14.7Node.js 24.22.1Go 1.24.2確認日 2026年11月8日
面接での 話し方の例
書き始める
「同じ
値どうしの XOR は 0、 0 との XOR は 値のままで、 順番を 入れ替えても 結果は 同じです。 全部を XOR で まとめると、 対の 値は 打ち消し合って 消え、 1 回だけの 値が 残ります。 時間は O(n)、 追加の 記憶は O(1) です。」
書き終えたら、
「例 1 の
[7, 3, 5, 3, 7]を、順番を 入れ替えて 7 と 7、 3 と 3 を 先に まとめると、 どちらも 0 です。 残りは 0 と 5 の XOR で 5 です。」