题目
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
示例一
输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
限制
2 <= nums.length <= 10000
思路分析
- 在没有限制的条件下,直接排序去重就完了。但是这道题有限制。
- 所以这里要用位运算。异或。首先介绍异或的规则:1……1=0,0……1=1,0……0=0.因此,两个相同的数字异或答案是0,0异或任何数字都是其本身。所以我们将所有的数组中的数字异或起来就可以得到这两个数字不同的位数。例如对上面 [4,1,4,6],异或的结果是7.7的二进制0111.1和6不同的位数刚好是后三位。
- 因此我们现在要划分这两个数字,我们取其中一个位置,例如说最低位,根据和最低位相同或者不同,刚还能把数字分为两个不同的数字,保证这两个数字一定不会在同一个子数组里面。
代码
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
vector<int> ans(2, 0);
int flag = 0;
for(auto num : nums) flag ^= num;
cout<<flag<<endl;
flag = flag & -flag;//获取最低位
for(auto num : nums){
if(flag & num){
ans[0] ^= num;
}else{
ans[1] ^= num;
}
}
return ans;
}
};