目录
下面是题目介绍:
方法一:按位异或法
按位异或数组中所有元素和0~n的所有数最后可得消失的数字,原理是相同的数按位异或会抵消
代码如下:
int missingNumber(int* nums, int numsSize)
{
int x=0;
for(int i=0;i<numsSize;i++)
{
x^=nums[i];
}
for(int j=0;j<=numsSize;j++)
{
x^=j;
}
return x;
}
时间复杂度:O(n)
空间复杂度:O(1)
方法二:累加法
将0~n的数字累加然后减去数组中所有元素可得消失的数字
缺点是当数据量大时可能会内存溢出
代码如下:
int missingNumber(int* nums, int numsSize)
{
int x=0,y=0;
for(int i=0;i<numsSize;i++)
{
x+=nums[i];
}
for(int j=0;j<=numsSize;j++)
{
y+=j;
}
return y-x;
}
时间复杂度:O(n)
空间复杂度:O(1)
方法三:排序法
这里使用冒泡排序:
代码如下:
void Bubble_sort(int* nums, int numsSize)
{
for(int i=numsSize-1;i>0;i--)
{
int flag=1;
for(int j=0;j<i;j++)
{
if(nums[j]>nums[j+1])
{
int tmp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=tmp;
flag=0;
}
}
if(flag==1)
break;
}
}
int missingNumber(int* nums, int numsSize)
{
Bubble_sort(nums,numsSize);
for(int i=0;i<numsSize;i++)
{
if(nums[i]!=i)
return i;
}
return numsSize;
}
这里注意题目中说明缺失的数字存在,所以最后一个数字消失需要单独讨论
时间复杂度:O(n^2)
空间复杂度:O(1)