https://leetcode-cn.com/problems/set-mismatch/
思路:做法很多,只考虑空间 O ( 1 ) O(1) O(1)的方法。设答案为 a 、 b a、b a、b,数组的异或和为 s u m sum sum,再对所有的 1 < = i < = n 1<=i<=n 1<=i<=n做一遍 s u m x o r i sum\ xor\ i sum xor i,得到的结果就是 a x o r b a\ xor\ b a xor b,现在考虑怎么把他们分离出来。我们找到 a x o r b a\ xor\ b a xor b的为 1 1 1的最低位,然后依据此位把原数组和 [ 1 , n ] [1,n] [1,n]分成两个部分,每个部分单独做一次异或和就可以得到 a 、 b a、b a、b了,现在只需要考虑它们的顺序问题,显然遍历一遍数组即可。
class Solution {
public:
vector<int> findErrorNums(vector<int>& nums) {
int siz=nums.size(),sum=0;
for(int i=0;i<siz;i++)
sum^=(i+1)^nums[i];
int pos=1;
while(!(sum&pos))
pos<<=1;
int a=0,b=0;
for(int i=0;i<siz;i++)
{
if(nums[i]&pos)
a^=nums[i];
else
b^=nums[i];
if((i+1)&pos)
a^=(i+1);
else
b^=(i+1);
}
vector<int> ans{a,b};
for(int i=0;i<siz;i++)
{
if(nums[i]==b)
{
swap(ans[0],ans[1]);
break;
}
}
return ans;
}
};