classSolution { public: vector<int> singleNumbers(vector<int>& nums){ int x = 0, m = 1, n = 0; // 对于只有一个只出现一次的数字的情况,异或后结果就是那个值,而有两个的话,假设2个数字是x,y,则异或后结果为x^y for(auto& num : nums) n ^= num; // 设m为1,寻找x与y从左往右数不相同的第一个数字,异或中是相异为1,所以当m&n==1时,表示n的这位为1了,于是就找到了这个不相同的第一个数字,并保存到m while((m & n) == 0) // 注意 == 的优先级比 & 高 m <<= 1; for(auto& num : nums) { if((num & m) == 0) // 当且仅当m为1的这一位的数字为1时,与的结果才为1,因此那两个单独的数字必定不可能同时通过这个if条件,所以将原数列分成了两个子序列 x ^= num; } return {x, x ^ n}; // x ^ n = x ^ x ^ y = 0 ^ y = y } };