找出数组中出现奇数次的元素

题目1: 给定一个含有n个元素的整形数组,其中只有一个元素出现奇数次,找出这个元素

异或

题目2: 如果题目1中有两个数出现了奇数次,并且这两个数并不相等,如何在O(1)的复杂度内找出这两个数

假设这两个数为a,b 异或结果为x。问题是我们如何能够通过x得到a,b. 因为x不为0,所以x的二进制肯定有一位为1. 例如x的二进制为001001,那么我们只需要一个不为0的那个。k=1(或者k=4)意味着a或者b中有一个第k位位1,所以我们再到数组中寻找所有k=1位为1的所有数,并将他们和x进行异或。假设这个数为a,那么所有k=1为1的数包括a和其他数T,x^a^T=x^a = a^b^a = b, 求得b之后再和x异或,求得a

void findElement(vector<int> v){
    int s = 0;
    for (int i = 0; i < v.size(); i++){
        s ^= v[i];
    }
    int s_copy1 = s;
    int s_copy2 = s;
    int k = 0;
    //找到哪一位为1
    while ( !(s_copy1 & 1)){
        s_copy1 = s_copy1 >>1;
        k++;
    }
    //cout<<s<<" "<<k<<endl;
    for (int i = 0; i < v.size(); i++){
        if ((v[i]>>k) & 1)
            s ^= v[i];
    }
    //cout<<s<<" "<<s_copy2<<" "<<(s^s_copy2)<<endl;
    cout<<"one is: "<<s<<" the other one is: "<<(s^s_copy2)<<endl;
}
原文地址:https://www.cnblogs.com/yxzfscg/p/4782078.html