配列が2つ存在し、1回だけ出現する配列を持つ場合、XOR演算子を使用して、法律。例えば配列内に存在する数値をビットワイズ演算子を使用して1回だけ検索する
1 2 3 2 3
1^2^3^2^3 = (2^2)^(3^3)^1 = 1
しかし、我々は他の数字がn回occureことができるときに一度配列にoccures数、nは> 1を見つけるために、ビット単位のトリックを使用することができますか?
配列が2つ存在し、1回だけ出現する配列を持つ場合、XOR演算子を使用して、法律。例えば配列内に存在する数値をビットワイズ演算子を使用して1回だけ検索する
1 2 3 2 3
1^2^3^2^3 = (2^2)^(3^3)^1 = 1
しかし、我々は他の数字がn回occureことができるときに一度配列にoccures数、nは> 1を見つけるために、ビット単位のトリックを使用することができますか?
ビット単位の演算子を使用すると、n
が常に偶数でない場合を除きます。
しかし、一度発生するアイテムのソートアンドスキャンや、入力ドメインが何らかの理由で制限されている場合、各アイテムをバケットに割り当てるなど、使用できる方法はたくさんあります。最初の例として
:
def findASingle(list):
if list length is zero:
return nothing
if list length is one:
return first item in list
sort list
for each item in last other than first and last:
if item is different to both previous and next item:
return item
そして、第二のために、それは(例えば)一桁非負整数に制限だと仮定すると:
def findASingle(list):
create count[0..9], all set to zero
for each item in last:
count[item] = count[item] + 1
for each index 0 through 9 inclusive:
if count[index] is 1:
return index
return nothing
方法がありますバイナリ演算子ではできません。各数値をビットのベクトルとして表示し、sum(mod n)を使ってすべてのベクトルを合計します。結果のベクトルは、その一意の数を表します。
例えば、の考えるN = 3及び配列2 3 5 2 5 2
ベクトルである:[0 1 0]
、[0 1 1]
、[1 0 1]
、[0 1 0]
、[1 0 1]
、[1 0 1]
、[0 1 0]
要素毎の和の全てのベクトルは:
Mod 3であり、[0 1 1]
は、配列中の3つの固有の要素に相当する。
これはXORトリックの一般化です。実際にはXORは正確にこの操作です - モジュレーション2での集計。
かなり確信しているのは、 'n%2 == 0'の場合のみです。 – NathanOliver
@ NathanOliverはい、彼らはペアになると、お互いをキャンセルします。これは、負の数を掛けるようなものです.2,4、または6の負の数は、符号が互いに打ち消し合うように正の数になります。 3つ、5つ、または7つの負の数はそれぞれ、最終的な出力に向かう「ぶら下がり」ネガティブを持っています。 – Dan