题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
解法:
思路:使用异或
在一个数组里,逐个进行异或,如果该数组内只有一个不重复的数字k,那么异或后的结果就是该不重复的数字k
但是有两个不重复的数字出现呢?该怎么办,如何借鉴单个数字的思路
思路:
1)该数组逐个异或,最后的结果是两个不重复数字的异或结果
例如2和4 0010^0100=0110
2)找出异或结果中的第一个为1的位的位置;依据此位的判断划分两个子数组,可想而知,该位相同的数字一定包含相同的重复数字
3)在两个子数组中分别逐个异或,就可以得出不重复的数字num1和num2
举例24363255 异或结果 0010 ,划分为两个数组分别是
23632 455
再逐个分别异或就可得出结果
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int* num2)
{
if(data.size() < 2)//特殊情况当数组个数为两个时
return;
int resultExclusiveOR = 0;//定义存储最终异或结果的变量
for(int i = 0; i < data.size(); i++)
{
resultExclusiveOR ^= data[i];//逐个异或
}
unsigned int indexOf1 = FindFirstBitIs1(resultExclusiveOR);//调用函数,寻找异或结果中第一个为1的位对应的位置
*num1 = *num2 = 0;//需要寻找的两个数字
for(int j = 0; j < data.size(); j++)
{
if(IsBit1(data[j], indexOf1))//取出数组中对应位置为1的位
*num1 ^= data[j];//异或可得出第一个数字
else
*num2 ^= data[j];//异或得出第二个数字
}
}
unsigned int FindFirstBitIs1(int num)//子函数
{
int indexBit = 0;
while(((num & 1) == 0) && (indexBit < 8*sizeof(int)))
{
num = num >> 1;
indexBit++;
}
return indexBit;
}
bool IsBit1(int num, unsigned int indexBit)//子函数
{
num = num >> indexBit;
return (num&1);
}
};
参考【1】https://www.nowcoder.com/profile/5097639/codeBookDetail?submissionId=14787564
待续:若是不重复的数字有3个,分别找出呢?