微軟面試題 尋找陣列中出現的唯一重複的一個數
阿新 • • 發佈:2019-01-25
// 找陣列中唯一出現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; }