题目:一个整型数组
nums
里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
思路详解:
1.通过异或,用0与数组中每一个数异或,获取x1和x2这两个不同数的异或后的值
2.现在只需要将两个数分离开,方法:找到x1与x2异或后的数的某一位是1的位,通过判断数组中每一个数这一位是否为1进行分离,则最后x1与x2必定在不同的组里边
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* singleNumbers(int* nums, int numsSize, int* returnSize){
//思路:将数组中的每一个数与0异或,最后得到这两个数的异或的结果
// 分离这两个数:设置一个N是这两个数异或结果中为1的位,
// 必定一个数x1和x2的这个位不同,将这个位为1的放到一个数组中,
// 这个位为0的放到第二个数组中,x1和x2必定在不同的数组中实现分离
int i=0;
int ret=0;
int m=0;
//获取两个不同数异或后的值,即x1和x2异或的值
for(i=0;i<numsSize;i++)
{
ret=ret^nums[i];
}
//获取异或结果中任意一位是1的数
while(1)
{
if(ret&(1<<m))
{
break;
}
else
{
m++;
}
}
int x1=0;
int x2=0;
//分离这两个数,根据m这个位
for(i=0;i<numsSize;i++)
{
if(nums[i]&(1<<m))
{
x1=x1^nums[i];
}
else
{
x2=x2^nums[i];
}
}
int *retArr=(int *)malloc(sizeof(int*)*2);
retArr[0]=x1;
retArr[1]=x2;
*returnSize=2;
return retArr;
}