【剑指】50,数组中只出现一次的数字
题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路:
这个题目是之前的数组中只出现一次的的一个数字的变形。重点在于我们要将这两个数字分开在两个不同的堆。所以,思路形成了:这两个数字一定不一样。所以我们将所有的数字先一起异或。的出来的结果就是实际的那两个数字的异或结果。然后我们通过提取里面的数字的某一个为1的位来实现将数组分为两堆。然后我们通过对两堆分别异或,最后的出来的结果就为这两个数字。
代码:
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int n=data.size();
if(n==0) return ;
if(n<2) return;
*num1=0;
*num2=0;
int xorres=0;
for(int i=0; i<n;)
{
xorres^=data[i++];
}
int andres=0;
int movebit=0; //位从0开始
while(andres!=1) //找到xorres第一个为1的位。
{
andres= xorres & 1;
if(andres!=1)
{ xorres= xorres>>1;
movebit++;
}
}
int mark=1<<movebit;
for(int i=0;i<n;i++)
{
if(data[i]& mark)
*num1^=data[i];
else
*num2^=data[i];
}
return ;
}
};
还没有评论,来说两句吧...