一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次,找出這兩個數字
阿新 • • 發佈:2019-01-22
【問題描述】:一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次。找出這兩個數字,程式設計實現。
【解決思路】:一組數中如果有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; }