class Solution {
public:
    //如果数组中只有一个单数,所有的数进行异或,结果值为单数
    //但是有两个,我们想就分两组来异或,通过一位来分两组,相同的数一定为一组,
    //但是两个单数如何分到两组呢,需要找到那一位可以区分两个数的,也就是两个数的那位是不同的,本数组所有进行异或,两个数不同的那位为1,使用即可
    vector<int> FindNumsAppearOnce(vector<int>& nums) {
        int s = 0;
        for(int i=0; i<nums.size(); i++){  //所有进行异或
            s ^= nums[i];
        }

        int mask = 1;
        while((mask & s) == 0){  //找到一个1
            mask <<= 1;
        }

        int a=0, b=0;
        for(int num:nums){
            if( (num & mask)==0 ){  //分组异或
                a ^= num;
            }else{
                b ^= num;
            }
        }

        if(a > b){
            swap(a, b);  //排序
        }

        return {a, b};
    }
};