class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param array int整型vector
     * @return int整型vector
     */
    int xorRes(vector<int>& array) { // 寻找数组中只出现一次的数字(一轮xor只能找出一个)
        int sum = array[0];
        for (int i = 1; i < array.size(); i++) {
            sum = array[i] ^ sum;
        }
        return sum;
    }
    vector<int> FindNumsAppearOnce(vector<int>& array) {
        // write code here
        int sum = xorRes(array);
        int cnt = 0; // 计算二进制中两个只出现一次的数字的差异位置
                    // 如4(100)和6(110),则在第二个二进制位有差异(xor异为1同为0)
        while (sum % 2 == 0) {
            sum /= 2;
            cnt++;
        }
        vector<int> arr1;
        vector<int> arr2;
        vector<int> res;
        for (int i = 0; i < array.size(); i++) {
            if ((array[i] >> cnt)%2 == 0) // 右移至差异位,则差异位为1的元素为一类,为0的元素为另一类,
                                        //两类分别调用xorRes即得到两个只出现一次的数字
                arr1.push_back(array[i]);
            else
                arr2.push_back(array[i]);
        }
        int a = xorRes(arr1), b = xorRes(arr2);
        if(a > b)
            swap(a, b);
        res.push_back(a);
        res.push_back(b);
        return res;
    }
};