题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
只能实现空间复杂度为O(n)的算法。
如果只有一个数字出现1次,其他的都出现了两次,那么用上面的思想可以求出。
现试着把原数组分成两个子数组,使得每个子数组包含一个只出现一次的数字,其他数字都成对出现两次。就可以分别找出两个只出现一次的数字。
与书上代码一样,为什么调试不能通过呢???
#include<map>
#include<iterator>
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
*num1 = 0;
*num2 = 0;
int len = data.size();
if(len < 2) return;
int temp = 0;
for(int i = 0; i < len; i++)
{
temp = temp ^ data[i];
}
int pos = FindBitOf1(temp);
for(int i = 0; i < len; i++)
{
if((data[i] >> pos) & 1)
*num1 ^= data[i];
else
*num2 ^= data[i];
}
}
int FindBitOf1(int n)
{
int pos = 0;
while(n & 1 == 0)
{
n = n >> 1;
pos++;
}
return pos;
}
};