三 解决方案 首先 回忆 异或操作,任意数字与自身相异或,结果都为0. 还有一个重要的性质,即任何元素与0相异或,结果都为元素自身。 解决方案: 1 从数组的起始位置开始,对元素执行异或操作,则最后的结果,即为此只出现了一次的元素。 2 题目中,数组中存在两个不同的元素,若是能仿造上述的解决方案,将两个元素分别放置在两个数组中,然后分别对每个数组进行异或操作, 则所求异或结果即为所求。 3 首先对原数组进行全部元素的异或,得到一个必然不为0的结果,然后判断该结果的2进制数字中,为1的最低的一位。 然后根据此位是否为1 ,可以把原数组分为两组。则两个不同的元素,必然分别在这两个数组中。 4 然后对两个数组,进行异或操作,即可得到所求。 四 代码示例 #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int N = 10; int getSingle(int *a) { //获取全部元素的异或结果 if(!a) { // return -1; } int sum = a[0]; for(int i = 1; i < N; i++) { sum ^= a[i]; } return sum; } void getTwo(int *a, int &one, int &two, int sum) { unsigned int flag = 1; while(1) { if(flag&sum) break; flag = flag << 1; } one = 0; two = 0; for(int i = 0; i < N; i++) { if(a[i]&flag) { one ^= a[i]; } else { two ^= a[i]; } } cout << sum << ' ' << one << ' ' << two << endl; } int main() { int a[N] = {3, 5, 8, 8, 5, 3, 1, 4, 4, 10}; int single = getSingle(a); int one = 0; int two = 0; getTwo(a, one, two, single); system("pause"); return 0; }