leetcode 260
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?
数组nums中所有的数异或的结果res为只出现一次的两个数的异或值,res二进制的各个位中第一个为1的位置(由于1^0=1),这两个数一定是一个是1一个是0。所以根据这一位置是1还是0可以将数组nums划分成两组,分别在每一组中对所有数进行异或,即可得到要求的两个数。代码如下:
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int res[2];
res[0]=0;//保存数组中所有数的异或结果
for(int i=0;i<nums.size();i++)
res[0]=res[0]^nums[i];
int mark=1;//非0位是异或结果中第一个1出现的位置
for(i=1;i<=32;i++)
{
if((res[0]&mark)==mark)
break;
mark=mark<<1;//当前第i位上非1,则进入下一次循环看第i+1位是否为1
}
//清零分别保存两组的异或结果
res[0]=0;
res[1]=0;
for(i=0;i<nums.size();i++)
{
if((nums[i]&mark)==mark)
res[0]=res[0]^nums[i];
else
res[1]=res[1]^nums[i];
}
vector<int> v(res,res+2);
return v;
}
};