[解法3]: 使用异或
问题1: 找出出现奇数次的两个数
void findRepeatedTwoNumbers(int a[], int n, int& no1, int& no2) { int i, j, temp; //计算这两个数的异或结果, temp = 0; for (i = 0; i < n; i++) { temp ^= a[i]; } // temp的值现为两个出现奇数次的数的异或 // 找第一个为1的位 for (j = 0; j < sizeof(int) * 8; j++) { if (((temp >> j) & 1) == 1) { break; } } // 第j位为1,说明这两个数字在第j位上是不相同的 // 由此分组即可,一个分组在此位上为1,另一组在此位上为0;这两个数分别位于这两个分组中; // 对两个分组中的数分别计算异或,得到的值即为所求的值; 每个分组中除所求的数外,其余的都出现偶数次; no1 = 0, no2 = 0; for (i = 0; i < n; i++) { if (((a[i] >> j) & 1) == 0) // 分组1 { no1 ^= a[i]; } else // 分组2 { no2 ^= a[i]; } } }