[面试] 找出数组中两个只出现一次的数字找出这两个只出现一次的数字

三 解决方案
    首先 回忆 异或操作,任意数字与自身相异或,结果都为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;
}

posted @ 2013-01-25 20:52  小尼人00  阅读(224)  评论(0编辑  收藏  举报