我正在处理一个算法问题(在leetcode上),它询问以下内容:
给定一个包含n
个0, 1, 2, ..., n,
个不同数字的数组,找到数组中缺少的数字。
例如,
给定nums = [0, 1, 3]
返回2
。
我目前的答案是:
var missingNumber = function(nums) {
return nums.filter(function(item, index, arr) {
return arr[index] - arr[index - 1] > 1;
}).shift() - 1;
};
然而,leetcode正在使用这两个测试用例(在其他一些测试用例中)对我来说没有意义:
输入:[0]
预期:1
输入:[0, 1]
预期:2
输入:[1]
预期:0
根据我的理解,算法要求返回数组中缺少的单个数字,因为第一个数字实际上缺少地点。我在这里遗漏了什么,或者这个算法的说明很不清楚?
答案 0 :(得分:3)
1..n
的整数总和为:
因此,具有n
值的长度为0..n
的数组的预期总数将是相同的。丢失的数字将是总数减去数组中实际值的总和:
"use strict";
let missingNumber = function(nums) {
let n = nums.length;
let expected = n * (n + 1) / 2;
let total = nums.reduce((a, b) => a + b, 0);
return expected - total;
}
答案 1 :(得分:3)
使用XOR操作有不同的方法。这里的想法是与自身进行异或的数字将始终为0.我们可以存储变量xor1
中从0到N的所有数字的XOR以及变量xor2
中数组的所有数字的XOR 。 xor1
和xor2
的异或将是缺失的数字,因为它只会显示在xor1
中,而不会显示在xor2
中。
function foo(arr){
var n = arr.length;
var xor1 = 0, xor2 = 0;
for(var i = 0;i <= n;i++)
xor1 ^= i;
for(var i = 0;i < n;i++)
xor2 ^= arr[i];
return xor1 ^ xor2;
}
答案 2 :(得分:1)
这就是我实现它的方法,你可以循环到origin
到数组长度,所以如果传入的数组通过了测试,它会尝试查看<=
nums[nums.length]
并正确返回undefined
。如果它们传入一个空数组,则返回0.
i
答案 3 :(得分:0)
尝试使用indexOf()
方法。如果找不到该项,则返回-1
。
nums = [0, 1, 3];
var missingNumber = function(nums){
for(i = 0; i <= nums.length; i++){
if(nums.indexOf(i) < 0 ) {
return i;
}
}
return 0;
}