给定一个整型数组arr,其中有两个数出现了奇数次,其他的数都出现了偶数次,找到这两个数。要求时间复杂度为O(N),额外空间复杂度为O(1)。
给定一个整形数组arr及它的大小n,请返回一个数组,其中两个元素为两个出现了奇数次的元素,请将他们按从小到大排列。
与之前不同,这次单数次出现数字为两个,仍然使用位运算,但是因为有两个数,全部异或的结果就是两个单数次异或的结果。比较朴素的想法是将数组分为两组,这样就与之前的问题一致了。
class OddAppearance {
public:
vector<int> findOdds(vector<int> arr, int n) {
// write code here
int temp=0,tmp=0,i,k;
vector<int> res;
for(i=0;i<n;i++){
temp^=arr[i];
}
for(i=0;i<sizeof(int)*8;i++){
k=1<<i;
if(temp&k) break; //寻找两个数异或之后某一位为1,则这两个数在这一位肯定是不同的,以这个为基准,就可以将数组一分为二
}
for(i=0;i<n;i++){
if(arr[i]&k) tmp^=arr[i]; //将该位值为1的所有数异或,剩下的一定是其中一个单数次出现的值
}
temp=temp^tmp; //再次异或,剩下的就是另外一个数字
if(temp>tmp){
res.push_back(tmp);
res.push_back(temp);
}
else{
res.push_back(temp);
res.push_back(tmp);
}
return res;
}
};