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;
}
};