力扣题解思路:
想到了异或运算,但是没有想到怎么最后把两个数分开emmmmmmmmm.........................
AC代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* singleNumbers(int* nums, int numsSize, int* returnSize)
{
int ret = 0;
int i = 0;
int num1 = 0;
int num2 = 0;
int pos = 0;
int *arr = (int *)malloc(2 * sizeof(int));//要动态开辟内存空间存储返回值,返回类型为int*,不能使用临时数组
//通过0对自身依次异或,将两个单独的数的异或后的结果找出,再通过结果将两个值分离开来
for(i = 0; i < numsSize; i++)
{
ret ^= nums[i];
}
//找到异或后结果的二进制序列,找出为1的位数(如果为1,则说明两个单独数在这个位不相同,可凭此将两个数分离)
for(i = 0; i < 32; i++)
{
if((ret>>i) & 1 == 1)
{
pos = i;
break;
}
}
//找到位数后,将按其他数的这个位数是否为1,还是为0分离,这就形成了两组数
//各带一个单独数
//在分别自身异或,最后剩下的就是单独数
for(i = 0; i < numsSize; i++)
{
if((nums[i] >> pos) & 1 == 1)
{
num1 ^= nums[i];
}
else
{
num2 ^= nums[i];
}
}
arr[0] = num1;
arr[1] = num2;
*returnSize = 2;
return arr;
}