数组nums
包含从0
到n
的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
思路1:暴力枚举
定义一个[0~n]的数组与所给数组nums进行循环遍历,如果不相等则返回那个数。
int missingNumber(int* nums, int numsSize){
int sz=numsSize+1;
int arr[sz];
for(int i=0;i<sz;i++){
arr[i]=i;
}
for(int i=0;i<sz;i++){
int count=0;
for(int j=0;j<numsSize;j++){
if(arr[i]==nums[j]){
count++;
}
}
if(count==0){
return arr[i];
}
}
return 0;
}
思路二:求和相减
只需要将原本的数求和,与所给的数组求和,相减就可以得到缺失的那个数
int missingNumber(int* nums, int numsSize){
int my_total=((0+numsSize)*(numsSize+1))/2;
int nums_total=0;
for(int i=0;i<numsSize;i++){
nums_total+=nums[i];
}
return my_total-nums_total;
}
思路三:按位异或
根据按位异或原则,相同为0,不同为1,0与任何数异或为它本身。例如1 1 3 2 4 3 4 从第一个1异或到最后一个数4,相同的就没了,只剩一个数2。那么我们就可以按照这种思路,定义一个初始值为0的变量,先与我的数组进行异或,再与给定数组进行异或,我的数组里如果含有给定数组的里数那么就异或掉,最后异或出一个没有的数。
int missingNumber(int* nums, int numsSize){
int x=0;
int i=0;
for(i=0;i<=numsSize;++i){
x^=i;
}
for(i=0;i<numsSize;++i){
x^=nums[i];
}
return x;
}