62倍の数種の配列を出現 - のオファーを受賞

タイトル説明

二つの数の整数型配列に加えて、他の数字が二回表示されます。これら二つの図が表示されるだけで検索するプログラムを作成してください。

ソリューション:

私たちは、自然のXORを考える:
独自の排他的な数のいずれか、またはゼロに等しいです。それは我々がXOR配列にそれぞれ番号を最初から最後まで回した場合、これらの数字はすべて異なるまたはオフセットの2のペアで来るので、その後、最終結果が正確数は、一度だけ表示されています。

我々は、元の配列が各サブアレイは、他の数値はペアで2回表示させながら数は、一度だけ表示され含まれるように2つのサブアレイに分割されてみました。これは二つのアレイに分割することができた場合は、それぞれ、我々は二つの数字が一度だけ、前のアプローチに基づいて表示されています。

私たちは、結果は、他の数値は、全て異なる、またはオフセットで、二回登場しているので、結果として二つの数字は、唯一のXOR結果いったん表示されていることである、XOR配列にそれぞれ番号を最初から最後まで回します。なぜならこれら二つの図の確かに同じではない場合、XORの結果は確かにゼロではない、すなわち、一方に少なくとも一つのバイナリ表現の結果の数です。我々は、n番目の位置と呼ぶ得られた数の第1ビット位置1を見つけます。
今、我々は、n番目のビットが1でない各桁の第2のサブ・アレイ、標準デジタル元の配列は、それぞれ数が1である2つのサブアレイ、nビットの第一のサブアレイに分割されていますnビットは0です。
当社の基準は、デジタルビットにグループ化されているので1または0の場合、デジタル2の出現は確かに同じサブアレイに割り当てられています。2のいずれかで同じ番号が同じであるので、我々はどこへ行く2つのサブアレイに割り当てられた2つの同一の番号を置くことができないので、我々は、元の配列は、2つのサブアレイに分割されてい、各サブアレイが含まれています他の図は、二回登場していながら数字は、一度だけ表示されます。

 

 

1  クラスソリューション{
 2  公共3      ボイド FindNumsAppearOnce(ベクトル< 整数 >データ、INT * NUM1、INT * NUM2){
 4          もし(data.size()== 0のリターン;
5          INT resultExclusiveOR = 0 6          のための(自動A:データ)resultExclusiveOR ^ = A。
7          の符号なし整数 indexOf1 = FindFirstBitIs1(resultExclusiveOR)。
8  
9          * NUM1 = * NUM2 = 0 10          のための(自動A:データ)
 。11          {
 12で             IF (IsBit1(A、indexOf1))
 13である                  * NUM1 ^ = A;
 14              
15                  * NUM2 ^ = A;
 16          }
 17      }
 18である 
。19      // 右から数はNUMを開始見つけます最初のビットは1であり、
20      の符号なし整数は、(FindFirstBitIs1 INT NUM)
 21は     、{
 22である         INT INDEXBIT = 0 ;
 23は         、一方(((NUM&1)== 0)&&(INDEXBIT <8 * はsizeofINT )))
 24          {
 25              NUM = NUM >> 1 26              ++ indexBit。
27          }
 28  
29          リターンindexBit。
30      }
 31  
32      // 判断数字NUM的第indexBit位是不是1 
33      ブール IsBit1(int型 NUM、符号なし整数indexBit)
 34      {
 35          NUM = NUM >> indexBit。
36          リターン(&NUM 1 )。
37     }
 38  
39 }。

 

おすすめ

転載: www.cnblogs.com/zzw1024/p/11707326.html