1、https://leetcode-cn.com/problems/set-mismatch/solution/cyi-huo-fa-xiang-jie-by-feng-feng-19/
边界条件的设定很难想到
t = sum & -sum
主站136,137,260,645,程序员面试金典17_19是类似的位运算。
其中136比较基础,260与本题相似,137比较复杂,645与程序员面试金典17_19相似。
class Solution {
public:
vector<int> findErrorNums(vector<int>& nums) {
int sum = 0;
int n = nums.size();
for(int i = 0; i < n; i++)
{
sum ^=(i+1)^nums[i];
}
int t = sum & (-sum);
int xor1 = 0;
int xor2 = 0;
for(int i = 1; i <= n; i++)
{
if(i&t)
{
xor1 ^=i;
}else{
xor2 ^=i;
}
}
for(int i = 0; i < n; i++)
{
if(t&nums[i])
{
xor1 ^=nums[i];
}else{
xor2 ^=nums[i];
}
}
if(count(nums.begin(),nums.end(),xor1) == 0)
{
return vector<int>{xor2,xor1};
}
return vector<int>{xor1,xor2};
}
};