數組中只出現一次的數字

題目:給定數組中只有兩個數出現一次,其他的數都出現兩次,請找出這兩個數。
解題:0^0^1=1, 1^1^0=0可知,異或運算可以找出數組中出現一次的數字(如果只有一個數字的話),a^a^b^b^c^d=c^d,可知數組異或運算的結果爲出現一次數字的異或的結果,那麼結合數組異或結果的數字就能找出這兩個數字,可根據c^d的結果的第一個爲1的二進制位(c,d中該二進制爲一個爲0,一個爲1),將數組分成兩部分,則這兩部分將各存在出現一次數字中的一個,讓利用異或運算就能找出。
代碼如下:

nt FindFirstBitIs1(int num)
{

int index = 0;
while ((!(num&1))&&(index<8*sizeof(int)))
{
    index++;
    num=num >> 1;
}
return index;

}

bool IsBit1(int num,int index)
{

return (num >> index) & 1;

}
void FindFirstAppearOnce(int data[],int length,int *num1,int *num2)
{

if (data==NULL||length==0)
{
    return;
}
int Or = 0;
for (int i = 0; i < length;i++)
{
    Or ^= data[i];
}
int firstbit1 = FindFirstBitIs1(Or);
for (int i = 0; i < length;i++)
{
    if (IsBit1(data[i], firstbit1))
    {
        *num1 ^= data[i];
    }
    else
    {
        *num2 ^= data[i];
    }
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章