题目:
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?
思路:
相关题目:
LeetCode OJ 之 Single Number (唯一的数字)
LeetCode OJ 之 Single Number II (唯一的数字 - 二)
参考:http://blog.csdn.net/u012243115/article/details/45286963。
代码:
class Solution {
public:
vector<int> singleNumber(vector<int>& nums)
{
vector<int> result;
int len = nums.size();
if(len < 2)
return result;
int tmp = 0;
for(int i = 0 ; i < len ; i++)
tmp ^= nums[i];
int indexOfOne = 0;
for(int i = 0 ; i < 32 ; i++)
{
if( (tmp & (1 << i) ) != 0) //注意:位操作符&的优先级很低,这里要加()。这里用1做移位操作比用tmp做移位操作更好,因为如果tmp是负数,右移的话前面会补1.(尽管这里不影响结果,但是最好还是不要对tmp做移位操作)
{
indexOfOne = i;
break;
}
}
int tmp2 = (1 << indexOfOne) ;
int num1 = 0 , num2 = 0;
for(int i = 0 ; i < len ; i++)
{
if(nums[i] & tmp2 )
num1 ^= nums[i];
else
num2 ^= nums[i];
}
result.push_back(num1);
result.push_back(num2);
return result;
}
};