题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字(num1,num2)。
思路:相同的数字异或的结果是0,那么我们把数组里的数字全都异或,结果肯定是出现了一次的异或结果result;
假设result的二进制为1的最高位为position,那么num1的二进制的position位和num2的二进制position为肯定不同;
这时候,我们根据数字的二进制position为是否为1,将原来的数组分为两个数组,并且两个数组分别出现num1和num2;
最后把两个数组分别异或,就能知道只出现的一次的数字了。
#include <iostream>
using namespace std;
#include <vector>
class Solution {
public:
int findLastOne(int num)
{
int pos = 0;
while ((num&1) == 0)
{
num = num >> 1;
pos++;
}
return pos;
}
void FindNumsAppearOnce(vector<int> data, int* num1, int *num2) {
if (data.size() < 2) return;
int result = 0;
for (int i = 0; i < data.size(); i++)
result ^= data[i];
//cout <<"result = " <<result << endl;
int pos = findLastOne(result);
//cout <<"pos = " <<pos << endl;
*num1 = 0;
*num2 = 0;
for (int i = 0; i < data.size(); i++)
{
if ((data[i] >> pos) & 1 == 1)
{
*num1 ^= data[i];
//cout << data[i] << '\t';
}
else
*num2 ^= data[i];
}
cout << endl;
return;
}
};
int main()
{
Solution s;
int num1, num2;
vector<int> a = { 2, 4, 3, 6, 3, 2, 5, 5 };
s.FindNumsAppearOnce(a, &num1, &num2);
cout << num1<<'\t'<<num2<<endl;
return 0;
}