首先第一道题如果不限制时间复杂度那么是有很多种解法的,但是在这里限制为O(N)的时间复杂度因此我们要另辟蹊径使用位运算的方法,在这里我采用的是按位异或据出题思路如下
我们首先要搞懂题目的意思,说有一段有序数字随机缺一个,怎么找出缺的这一个我们可以举个例子如图
因此代码如下
第二题
int* singleNumbers(int* nums, int numsSize, int* returnSize){
int x=0;
//首先找出两个数的异或值
for(int i=0;i<numsSize;i++)
{
x^=nums[i];
}
//找出第m位为一
int m=0;
while(m<32)
{if(x&(1<<m))
{ break;}
else
m++;
}
//把其分为两个组
int x1=0;
int x2=0;
for(int i=0;i<numsSize;i++)
{
if(nums[i]&(1<<m))
{
x1^=nums[i];
}
else
{ x2^=nums[i];
}
}
int* xArr=(int*)malloc(sizeof(int)*2);
xArr[0]=x1;
xArr[1]=x2;
*returnSize=2;
return xArr;
}