题目描述:
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.
Example:
Input: [1,2,1,3,2,5]
Output: [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?
在一个数组中只有两个数出现了一次,其他数都出现两次,求出这两个数,时间复杂度必须为O(1),而且只能利用常数空间。
设这两个数为a,b,那么首先把数组中所有数字进行异或,从而得到a异或b,再从中找出一位为1,也就是说在这一位上,a和b一个为0,一个为1。得到了这一位之后,我们把在这一位为1的所有数再取异或,由于排除了其中一个数,可以得到一个只出现一次的数,进而得到另外一个数。
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int x=0;
for(int i=0;i<nums.size();i++) x^=nums[i];
int y=0;
for(int i=0;i<32;i++)
{
y=1<<i;
if((y&x)>0) break;
}
int a=0;
for(int i=0;i<nums.size();i++) if((y&nums[i])!=0) a^=nums[i];
int b=x^a;
vector<int> result;
result.push_back(a);
result.push_back(b);
return result;
}
};