https://leetcode-cn.com/problems/set-mismatch/
思路:做法很多,只考虑空间的方法。设答案为,数组的异或和为,再对所有的做一遍,得到的结果就是,现在考虑怎么把他们分离出来。我们找到的为的最低位,然后依据此位把原数组和分成两个部分,每个部分单独做一次异或和就可以得到了,现在只需要考虑它们的顺序问题,显然遍历一遍数组即可。
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;
}
};