今天开始小编开始给大家带来算法题目的讲解,首先我们看题目描述
这里我们有三种思路,首先是比较常规的方法,也是大家比较常见的,这里我们开辟一块空间,对这个数组出现的数,进行标记,然后通过判断找到缺失的那个数,这里的时间复杂度是O(N)。
int missingNumber(int* nums, int numsSize){ int *arr=(int*)calloc(numsSize+1,sizeof(int)); int i=0; for(i=0;i<numsSize;i++) { arr[nums[i]]++; } for(i=0;i<numsSize;i++) { if(arr[i]==0) { break; } } return i; }
思路二,这里我们就要利用^操作符的一个特性,这里我直接给大家结论,推导过程我会在操作符的介绍时具体讲解。结论是:
1.a^a=0
2.0^a=a
接下来直接给大家上代码
int missingNumber(int* nums, int numsSize){ int val=0; for(int i=0;i<numsSize;i++) { val^=nums[i]; } for(int i=0;i<=numsSize;i++) { val^=i; } return val; }
这里最后得到的val就是那个缺失的数字。
思路三,这里我们就要基于数组本身出发,利用该和形式相减得到那个缺失的数字
代码如下:
int missingNumber(int* nums, int numsSize){ int i=0; int sum=0; int ret=0; for(i=0;i<numsSize+1;i++) { sum=sum+i; } for(i=0;i<numsSize;i++) { ret=nums[i]+ret; } return sum-ret; }
这里也是完美通过。