返回Array中的缺失数字(算法)

时间:2016-05-24 04:43:19

标签: javascript arrays algorithm

我正在处理一个算法问题(在leetcode上),它询问以下内容:

给定一个包含n0, 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

根据我的理解,算法要求返回数组中缺少的单个数字,因为第一个数字实际上缺少地点。我在这里遗漏了什么,或者这个算法的说明很不清楚?

4 个答案:

答案 0 :(得分:3)

1..n的整数总和为:

enter image description here

因此,具有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 。 xor1xor2的异或将是缺失的数字,因为它只会显示在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;
}