分组异或
因为除了这两个数字出现了一次,其他都出现的两次。
又因为
a ^ a = 0
,则所有数字异或得到的是这只出现一次的两个数字的异或值。则可以根据两个数字异或值的二进制中某一位是1,说明这两个数字在这一位是不同的,则可以再进行分组异或,就可以得到这两个数字。
- 所有数字异或得到出现一次的两个数字的异或值。
- 用lowbit,找出两个数字不同的二进制位。
- 再枚举一遍,根据这两个数字在该位上的不同分组异或。
时间复杂度$O(N)$,时间复杂度$O(1)$
AC代码
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
long long t = 0;
for (auto x : nums) t ^= x;
t = (t & (-t));
int a = 0, b = 0;
for (auto x : nums) {
if (x & t) a ^= x;
else b ^= x;
}
return {a, b};
}
};