1. 程式人生 > >一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次,找出這兩個數字

一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次,找出這兩個數字

【問題描述】:一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次。找出這兩個數字,程式設計實現。

【解決思路】:一組數中如果有1個不重複出現的數字,其他數字都重複出現2次,那麼將所有的值異或在一起就是這個不重複的數字。例如:{1,1,2,2,3,3,4},所有值異或的結果是4。如果有2個不重複出現的數字,例如{1,1,2,2,3,3,4,5},所有值異或的結果是{4,5}異或的結果為1。我們只要將這個異或的值分開就好:

1.將所有值異或在一起,得到4和5異或的結果1

2.找到異或結果1的二進位制中第一個為1的位置

3.按照這個位置為為兩組,分別異或起來就得到最終的結果

【參考程式碼】:

#include<stdio.h>
#include<windows.h>

void find_num(int arr[], int len)
{
	int i = 0;//迴圈變數
	int ret = 0;//記錄所有值異或的結果
	int pos = 0;//記錄ret二進位制為第一個為1的位置
	int x = 0;//將一組值異或在x,得到1個沒有相同數字的值
	int y = 0;//將另一組值異或在x,得到另1個沒有相同數字的值
	for (i = 0; i < len; i++)
	{
		ret ^= arr[i];
	}//將陣列的所有值異或
	for (i = 0; i < 32; i++)
	{
		if (1 == ((ret >> i) & 1))
		{
			pos = i;
			break;
		}
	}//找到ret二進位制為第一個為1的位置
	for (i = 0; i < len; i++)
	{
		if (1 == ((arr[i] >> pos) & 1))
		{
			x ^= arr[i];
		}
		else
			y ^= arr[i];
	}//分組異或
	printf("x=%d,y=%d\n", x, y);

}
int main()
{
	int arr[] = { 1, 2, 3, 1, 2, 3, 4, 5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	find_num(arr, sz);
	system("pause");
	return 0;
}