Given an array of numbers nums
, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.
For example:
Given nums = [1, 2, 1, 3, 2, 5]
, return [3, 5]
.
Note:
- The order of the result is not important. So in the above example,
[5, 3]
is also correct. - Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?
基本思路:
一个数同自己进行异或,结果为0.
如果每个数都出现2次,只有一个数出现1次。那么我们只需要对全体数作异或,就能找到特殊数。
此题中,有两个特殊数。需要进行两趟扫描。
1. 对全体数进行一遍异或,得出x ^ y
x ^ y 中 bit为1之处,则是x和y的不同位。
2. 通过此不同位,可以将x和y分到不同组中,然后对分组后的数进行异或运算,就能求出x或者y。
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int xy = 0;
for (auto n: nums)
xy ^= n;
const int diff = xy & (xy-1) ^ xy;
int x = 0;
for (auto n: nums)
if (n & diff)
x ^= n;
return {x, xy ^ x};
}
};
注,在求bit位为1的最右的一位时,可以有多个求法,如:
const int diff = xy & (xy-1) ^ xy;
const int diff = xy & ~(xy-1);
const int diff = xy & -xy;