Single Number III

题目:

Given 2*n + 2 numbers, every numbers occurs twice except two, find them.

分析:

第一遍循环用xor操作找到这两个数字的xor结果;然后因为这两个数不相等,那么相同为零,相异为一的原则下,这个xor结果中任何一个=1的bit就说明是这两个说相异的bit。然后找到任何一个这样的=1的bit,然后第二遍循环,&这个bit得0的一组,&这个bit得1的是另一组,就刚好得知这两个不同的数了。

注意,取得任意=1 bit的方法是temp &= -temp,在不包含越界的情况下,int 4是00000100而int -1是11111100,就是把前面的都换成1。所以就得到了=1的bit。

解法:

class Solution {
public:
    /**
     * @param A : An integer array
     * @return : Two integers
     */
    vector<int> singleNumberIII(vector<int> &A) {
        // write your code here
        int temp = 0;
        for (int i = 0; i < A.size(); i++) {
            temp ^= A[i];
        }
        temp &= -temp;
        vector<int> res = {0, 0};
        for (int i = 0; i < A.size(); i++) {
            if ((temp & A[i]) == 0) {
                res[0] ^= A[i];
            } else {
                res[1] ^= A[i];
            }
        }
        return res;
    }
};

results matching ""

    No results matching ""