1. 程式人生 > >微軟面試題 尋找陣列中出現的唯一重複的一個數

微軟面試題 尋找陣列中出現的唯一重複的一個數

 
// 找陣列中唯一出現2次的數.cpp : Defines the entry point for the console application.
//
/*
假設你有一個用1001個整陣列成的陣列,這些整數是任意排列的,但是你知道所有的整數都在1到1000(包括1000)之間。
此外,除一個數字出現兩次外,其他所有數字只出現一次。假設你只能對這個陣列做一次處理,用一種演算法找出重複的那個數字。
如果你在運算中使用了輔助的儲存方式,那麼你能找到不用這種方式的演算法嗎?

1001個數異或結果與1-1000異或的結果再做異或,得出的值即位所求。
原理:
設重複數為A,其餘999個數異或結果為B。
1001個數異或結果為A^A^B
1-1000異或結果為A^B
由於異或滿足交換律和結合律,且X^X = 0  0^X = X;
則有
(A^B)^(A^A^B)=A^B^B=A
*/

#include "stdafx.h"

/*
  N為陣列元素個數減一,即為陣列中最大的數,即數的範圍為1-N
  陣列長度為N+1
 */

void xor_findDup(int * a,int N)
{
	int i;
	int result=0;
	for(i=0;i<N+1;i++)
	{
		result ^= a[i];
	}

	for (i=1;i<=N;i++) 
	{
		result ^= i;
	}

	printf("%d\n",result);

}



int main(int argc, char* argv[])
{
	int a[] = {1,2,3,4,4};
	xor_findDup(a,4);
	return 0;
}