《劍指offer》題目40:數組中只出現一次的數字

題目:一個整型數組裏除了兩個數字之外,其他的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。要求的時間複雜度是O(n)

因爲OJ牛客網,沒有要求時間複雜度,開始的時候採用暴力解法時間複雜度是On2O(n^2),書中要求複雜度是 OnO(n)

分析:題目可以抽象成這樣,有兩個數字出現了奇數次,其他數字出現了偶數次。我們可以想到用異或運算,對偶數次的數字異或後得0,奇數次的數字異或後得1。基於這樣的事實:兩個不同的數字必然至少有一位不同,進行xor運算後必然有一位爲1。
解法如下:

  1. 數組裏的數字依次進行xor。
  2. 找出第一個1所在的索引。
  3. 將數組裏的數字按照索引位是否爲1,分爲兩組。
  4. 兩個組裏數字分別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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章