题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
考察点:二进制和位运算的理解;简单思路解决复杂问题。
思路:先排序,再去找。或者直接找,复杂度都很高,这里我们简单优化,用O(n)的复杂度解决问题。
两个相同的数字异或之后结果为0。以及位运算判断位数。
class Solution {
public:
unsigned int findFirstBitIs1(int num)
{
int index = 0; //声明一定要知道初始化
while ((num & 1) == 0)//从后向前遍历每位,看哪一位是1
{
num = num >> 1;
index++;
}
return index;
}
bool IsBit1(int num, unsigned int index)//判断这个数字的index位置上是否是1,分为两组
{
num = num >> index;//直接移到这位
return (num & 1);//是1返回true,否则返回false
}
void FindNumsAppearOnce(vector<int> data, int* num1, int* num2)
{
*num1 = *num2 = 0;
if (data.size() < 2)
return;
int resultOR = 0;//标记异或结果
for (int i = 0; i < data.size(); i++)
resultOR ^= data[i];//将所有的数字异或一下,相同的数字都抵消了,剩下的那个找位数不同。
unsigned int index = findFirstBitIs1(resultOR);//找到区分的位置
for (int i = 0; i < data.size(); i++)
{
if (IsBit1(data[i], index))//分类进行异或
*num1 ^= data[i];
else
*num2 ^= data[i];
}
}
};