给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素.
思路:将所有数异或之后;numN=两个目标数的异或(两个相同的数异或结果为0,0与任何数异或结果为那个数本身),找出异或之后newN位数为1的位(这一位上两个目标数必是一个为1,另一个为0),将数组中这一位为1的分为一组异或,为0的分为一组异或,便得到两个目标数。
int* singleNumber(int* nums, int numsSize)
{
int newN=0;
//将所有数异或
for(int i=0;i<numsSize;++i)
{
newN^=nums[i];
}
int m=0;
//找出异或后二进制数为1的位
while(m<32)
{
if(newN & (1<<m))//ret与0相与为0
break;
else
++m;
}
//分离
int x1=0,x2=0;
for(int i=0;i<numsSize;i++)
{
if(nums[i]&(1<<m))
{
x1^=nums[i];
}
else
{
x2^=nums[i];
}
}
int*retArr=(int*)malloc(sizeof(int)*2);
retArr[0]=x1;
retArr[1]=x2;
return retArr;
}