C語言實現:一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次。
阿新 • • 發佈:2019-01-02
思路:異或陣列中的每一個數,最終出現的結果是兩個只出現一次數字的異或結果,,因為兩個陣列不一樣,所以異或結果不為0,二進位制結果有一個是1.在結果中找到第一個為1的位置,記為n,然後陣列右移n位,為1,為0,分別輸出兩個數
#include <stdio.h> #include<Windows.h> int two(int n) { int c = 0; while (n) { if (n % 2 == 1) { return c; } c++; n /= 2; } return -1; } void find_two(int*a, int size,int *p,int *q) { int find = 0; int ret = 0; for (int i = 0; i < size; ++i) { find ^= a[i]; } ret = two(find); for (int i = 0; i < size; ++i) { if (1 & (a[i] >> ret)) { *p ^= a[i]; } else { *q ^= a[i]; } } } int main() { int a[8] = { 1,1,3,3,4,5,6,6 }; int size = sizeof(a) / sizeof(a[0]); int p = 0; int q = 0; find_two(a, size,&p,&q); printf("%d,%d\n", p,q); system("pause"); return 0; }