一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
示例 1:
输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
示例 2:
输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]
限制:
2 <= nums.length <= 10000
基本思路:假设结果是a和b,x^x=0,先将所有数字异或,其结果等价于a^b,然后根据a和b在二进制上同一位置上异或为1的位置找出来,依次将数组分为两组,转换成在一个数组中,除目标外,其他元素都出现两次的问题。
vector<int> singleNumbers(vector<int>& nums) {
int k=0;
for(auto &it:nums){
k=k^it;
}
int a=0,b=0;
int pivot=k-((k-1)&k); //注意优先级,-优先于&
// pivot=(k&-k) x和-x从右往左第一个1的位置相同
//cout<<k<<" "<<pivot<<endl;
for(auto &it:nums){
if(it&pivot){
a=a^it;
}
else{
b=b^it;
}
}
return {a,b};
}