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?
这个题目的思路是位运算,假设数组中元素是 a1,a2,a3.......an,其中除ai和aj之外,其它元素均出现过两次,则a1 xor a2 xor a3......xor an = ai xor aj !=0.
设 ai xor aj = A .则 A 转换成二进制第一个1的位置就是 ai 和 aj 第一个对应二进制位不同的位置。可以以此将ai和aj分开.代码如下:
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int oxr =0;
for(int i =0;i<nums.size();i++) oxr^=nums[i];
int mark = oxr&(-oxr);
int a =0,b=0;
for(int i =0;i<nums.size();i++){
if(nums[i]&mark){
a^=nums[i];
}else{
b^=nums[i];
}
}
return vector<int>{a,b};
}
};