題目:一個整型數組裏除了兩個數字之外,其他的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。要求的時間複雜度是O(n)
因爲OJ牛客網,沒有要求時間複雜度,開始的時候採用暴力解法時間複雜度是,書中要求複雜度是
分析:題目可以抽象成這樣,有兩個數字出現了奇數次,其他數字出現了偶數次。我們可以想到用異或運算,對偶數次的數字異或後得0,奇數次的數字異或後得1。基於這樣的事實:兩個不同的數字必然至少有一位不同,進行xor運算後必然有一位爲1。
解法如下:
- 數組裏的數字依次進行xor。
- 找出第一個1所在的索引。
- 將數組裏的數字按照索引位是否爲1,分爲兩組。
- 兩個組裏數字分別xor,最後兩組裏分別剩下的數字即爲所求
代碼如下:
#include "stdafx.h"
#include"iostream"
#include"vector"
using namespace std;
void FindNumsAppearOnce(vector<int> data, int* num1, int *num2) {
if (data.size() < 2)
return;
int xorRes= 0;
for (int i = 0; i < data.size(); i++)
{
xorRes ^= data[i];
}
int count = 0;
while (!(xorRes>>1)&1)
{
count++;
}
for (int i = 0; i < data.size(); i++)
{
if ((data[i] >> count) & 1)
{
*num1 ^= data[i];
}
else
{
*num2 ^= data[i];
}
}
}
int main()
{
vector<int> data = { 0,0,1,2,3,3,4,4 };
int num1=0;
int num2=0;
FindNumsAppearOnce(data, &num1,& num2);
system("pause");
return 0;
}