给定一个整数数组 nums,其中恰好有两个元素只出现一次,其他所有元素均出现两次。 找出只出现一次的那两个元素。
示例:
给定 nums = [1, 2, 1, 3, 2, 5], 返回 [3, 5].
注意:
结果的顺序并不重要,对于上面的例子 [5, 3] 也是正确答案。
你的算法应该具有线性复杂度,你能否仅使用恒定的空间复杂度来实现它?
详见:https://leetcode.com/problems/single-number-iii/description/
Java实现:
class Solution {
public int[] singleNumber(int[] nums) {
int size=nums.length;
int[] res=new int[2];
if(size==0||nums==null){
return res;
}
int sum=0;
for(int num:nums){
sum^=num;
}
int n=1;
while((sum&n)==0){
n=n<<1;
}
for(int num:nums){
if((num&n)!=0){
res[0]^=num;
}else{
res[1]^=num;
}
}
return res;
}
}
C++实现:
方法一:
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int size=nums.size();
if(size==0||nums.empty())
{
return vector<int>();
}
int sum=0;
for(int val:nums)
{
sum^=val;
}
int n=1;
//从低位向高位,第一个非0位所对应的数字
while((sum&n)==0)
{
n=n<<1;
}
vector<int> res(2,0);
for(int val:nums)
{
if(n&val)
{
res[0]^=val;
}
else
{
res[1]^=val;
}
}
return res;
}
};
方法二:
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int size=nums.size();
if(size==0||nums.empty())
return vector<int>();
int diff=0;
for(auto &ele:nums)
diff^=ele;
vector<int> res(2,0);
diff&=-diff;
for(auto &ele:nums)
if(diff&ele)
res[0]^=ele;
else
res[1]^=ele;
return res;
}
};