web-dev-qa-db-ja.com

数字の問題を繰り返す

リストには1からNまでの番号があり、誤って追加された番号があります。したがって、合計でN +1の数があります。言語が処理できる最大の整数がNであると仮定します。繰り返し桁を見つけるための最速のアルゴリズムは何ですか?

注:これは宿題の問題ではありません。

4
picakhu

私はすべての数値をxorし、完全なリストのxorがどうあるべきかをxorします。 (そのxorはNに依存し、理解するのは難しくありません。)

Xorには次のプロパティがあるため、これは機能します。

  • 可換:a xor b = b xor a
  • 連想:(a xor b) xor c = a xor (b xor c)
  • 0は単位元です:a xor 0 = a
  • 自己否定:ʻa xor a = 0

さらに良いことに、表現のビット数を変更することなくそれを実行します。そして、xorはたまたまコンピューターで最速の操作の1つです。

したがって、その計算の結果は、リスト内の各数値をそれ自体のコピーとペアにし、それらをすべて一緒にxorしてから、mistkeによって挿入された余分な数値をペアにした場合と同じです。しかし、それは0になり、それ自体で何度もxoredされ、その後、余分な数でxoredされます。これはすべて余分な数になります。

5
btilly