数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
注意:本题相对书上原题稍作改动
示例 1:
输入:[3,0,1]
输出:2
示例 2:
输入:[9,6,4,2,3,5,7,0,1]
输出:8
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/missing-number-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
一开始的代码如下,因为从0开始到n的所有整数如果没有缺失,其和为(0+n)*(n+1)/2,将缺失后数组内数字的和加起来,做差即可知道缺失的是谁。
也可以这么想,数组是从1~n的整数,其和应该为(1+n)*n/2,现用0取代其中的某个数字,求取代的是几。
int missingNumber(int* nums, int numsSize){
int i=0,sumf=0,sumt=0;
sumt=numsSize*(numsSize+1)/2;
for(i=0;i<numsSize;i++)
{
sumf=sumf+nums[i];
}
return sumt-sumf;
}
优化内存后的代码如下
int missingNumber(int* nums, int numsSize){
int sum=0;
for(int i=0;i<numsSize;i++)
{
sum=sum+nums[i];
}
return numsSize*(numsSize+1)/2-sum;
}
还可以用异或的运算法则
a ^ b ^ b = a
a ^ b ^ a = b
a ^ a = 0
a ^ 0 = a
可以得,遍历一遍 结果=结果 ^ 每项 ^ i
var missingNumber = function(nums) {
var a =0 ;//因为数组少了一项,所以将结果初始值设为0,i从1开始遍历到n
for(var i =1;i<=nums.length;i++){ //
a = a ^ nums[i-1] ^ i
}
return a;
};
异或运算法则:
1. a ^ b = b ^ a
2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
3. d = a ^ b ^ c 可以推出 a = d ^ b ^ c.
4. a ^ b ^ a = b.