查找数组/范围中所有缺少的元素javascript

时间:2015-12-07 22:34:49

标签: javascript algorithm

我正在尝试编写一个函数来查找数组中所有缺少的元素。该系列从1 ... n开始。输入是未排序的数组,输出是缺少的数字。

下面是我到目前为止:

function findMissingElements(arr) {
  arr = arr.sort();
  var missing = [];

  if (arr[0] !== 1) {
    missing.unshift(1);
  }
  // Find the missing array items
  for (var i = 0; i < arr.length; i++) {

    if ((arr[i + 1] - arr[i]) > 1) {
      missing.push(arr[i + 1] - 1);
    }

  }
  return missing;
}

var numbers = [1, 3, 4, 5, 7, 8]; // Missing 2,6
var numbers2 = [5, 2, 3]; //missing 1, 4
var numbers3 = [1, 3, 4, 5, 7]; // Missing 2,6
console.log(findMissingElements(numbers)); // returns 2,6 correct
console.log(findMissingElements(numbers2)); // returns 1,4
console.log(findMissingElements(numbers3)); // returns 2, 6

我&#34;手动&#34;检查带有if块的第一个元素,有没有办法处理for循环中第一个元素的情况?

3 个答案:

答案 0 :(得分:5)

您可以通过跟踪下一个应显示的号码并将其添加到缺失号码列表中,同时小于下一个号码来生成该号码。

function findMissingElements(arr) {
  // Make sure the numbers are in order
  arr = arr.slice(0).sort(function(a, b) { return a - b; });
  let next = 1; // The next number in the sequence
  let missing = [];
  for (let i = 0; i < arr.length; i++) {
    // While the expected element is less than
    // the current element
    while (next < arr[i]) {
      // Add it to the missing list and
      // increment to the next expected number
      missing.push(next);
      next++;
    }
    next++;
  }
  return missing;
}

答案 1 :(得分:3)

效率不高但更直观的解决方案:

var n = Math.max.apply(null, arr);  // get the maximum
var result = [];
for (var i=1 ; i<n ; i++) {
    if (arr.indexOf(i) < 0) result.push(i)
}

答案 2 :(得分:1)

除了您的测试不一致之外,这对我来说感觉有点小:

function findMissingElements (arr, fromFirstElement) {
 
  arr.sort();
  
  var missing = [];
  var next = fromFirstElement ? arr[0] : 1;
  
  while(arr.length) {
    var n = arr.shift();
    while (n != next) {
     missing.push(next++); 
    }
    next++;
  }
  
  return missing;
  
}

var numbers = [1, 3, 4, 5, 7, 8]; // Missing 2,6
var numbers2 = [5, 2, 3]; // Missing 1, 4
var numbers3 = [1, 3, 4, 5, 7]; // Missing 2, 6

console.log(findMissingElements(numbers)); // returns 2, 6
console.log(findMissingElements(numbers2)); // returns 1, 4
console.log(findMissingElements(numbers3)); // returns 2, 6

我添加了一个参数fromFirstElement,如果传递true,它将使您能够从您传递的数组中第一个元素定义的数字开始。