具体思路:
很牛皮的一种思路;
目前见到这种类似找不同的题目,大概就这几个思路:
1.原地哈希;
2.利用数值范围进行hash辅助;
3.位运算;
采用异或思想,对于所以出现两次异或的数,最后全体异或的结果必定是0;
如果其中有指出现一次的a,b两个数,则结果是a^b;
但是对于a^b来说,必定位中至少有一位是1,代表a,b在该位不同;
此时按照该位进行全元素分桶,a,b必定落在不同的桶,每个桶的剩余元素必定成对出现;
此时两个桶分别得异或结果必定是a和b;
具体代码:
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
int temp=0;
for(auto& n:nums)
temp^=n;
int div=1;
while((div&temp)==0){
div=div<<1;
}
int a=0;
int b=0;
for(auto& n:nums){
if((div&n)){
a^=n;
}else{
b^=n;
}
}
return {a,b};
}
};