次のように説明したタイトル:
二つの数の整数型配列に加えて、他の数字が二回表示されます。これら二つの数字は1度だけ表示を見つけるためにプログラムを書いてください
問題を解決するための主要なアイデア
排他的OR演算、二つの同一の数字、0ようにして得られた排他的論理和演算の結果、アレイは、一度だけ出現数、他の数は、二回存在する場合
には、排他的OR動作原理によれば、すべての数は、排他的又はアレイであってもよいです見つけることができ、これは一度だけデジタル表示されます二つの数だけ配列一度表示された場合、アレイは2つのグループに分けることができる、唯一の番号を含む各グループは一度だけ表示されます。どのような配列は、サブアレイに分割されるのだろうか?
アレイの結果のすべての数字は確かに排他的OR 0、この数が1に等しいビットから抽出することができるではない。このビットが1であり、ないと、アレイは、全てのアレイに分割することができる
2 1の各ように、 XOR基は、対応する番号を得ることができます。
コードは以下の通りであります:
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int len = data.size();
if( len < 2 ){
return ;
}
int k = 0;
for(int i=0;i<len; i++){
k ^= data[i];
}
int index = fisrtIndexOf1(k);
*num1 = *num2 = 0;
for(int i=0; i<len ; i++){
if((data[i] >> index)&0x1){
*num1 ^= data[i];
}else {
*num2 ^= data[i];
}
}
}
int fisrtIndexOf1(int num){
int index = 0;
while( num ){
if(num &(0x1))
return index;
num = num>>1;
++index;
}
return -1;
}
};