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?
数组中只有两个元素只出现了一次,其他元素都出现了两次,因此还是先做异或得到这两个元素异或的结果result,然后获取result最右边为1的位置。因为result为1的位置表示这两个单数在这一位上不同,因此可以按照在这一位上取值不同对数组再重新遍历异或得到r1和r2.
class Solution {
public:
void FindFirstOne(int result,vector<int>& nums,int &r1,int& r2)
{
int pos = 0;
while((result&1) == 0)//寻找最右边是1的位置
{
pos++;
result = result>>1;
}
for(int i=0;i<nums.size();i++)
{
if((nums[i]>>pos)&1)
{
r1^=nums[i];
}else
r2^=nums[i];
}
}
vector<int> singleNumber(vector<int>& nums) {
if(nums.size()<=2) return nums;
int result = 0;
for(int i=0;i<nums.size();i++)
result ^=nums[i];
int r1=0,r2=0;
FindFirstOne(result,nums,r1,r2);
vector<int> last;
last.push_back(r1);
last.push_back(r2);
return last;
}
};