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

Javascript 查找数组/范围中缺少的所有元素,javascript,algorithm,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 < a

我试图编写一个函数来查找数组中所有缺少的元素。该系列从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
函数findMissingElements(arr){
arr=arr.sort();
var缺失=[];
如果(arr[0]!==1){
缺失。取消移位(1);
}
//查找缺少的数组项
对于(变量i=0;i1){
缺失。推送(arr[i+1]-1);
}
}
返回丢失;
}
变量数=[1,3,4,5,7,8];//失踪2,6
var numbers2=[5,2,3]//缺失1,4
变量编号3=[1,3,4,5,7];//失踪2,6
console.log(findMissingElements(number));//返回正确的2,6
console.log(findMissingElements(numbers2));//返回1,4
console.log(findMissingElements(numbers3));//返回2,6

我用if块“手动”检查了第一个元素,有没有办法处理for循环中第一个元素的情况?

您可以通过跟踪下一个应该出现的数字并将其添加到缺少的数字列表中,而该数字小于下一个数字

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;
}
函数findMissingElements(arr){
//确保数字是按顺序排列的
arr=arr.slice(0).sort(函数(a,b){返回a-b;});
设next=1;//序列中的下一个数字
让缺失=[];
for(设i=0;i
除了您的测试不一致之外,我觉得这有点整洁:

函数findAdminElements(arr,fromFirstElement){
arr.sort();
var缺失=[];
var next=fromFirstElement?arr[0]:1;
while(arr.length){
var n=arr.shift();
while(n!=下一个){
缺少。推送(下一个++);
}
next++;
}
返回丢失;
}
变量数=[1,3,4,5,7,8];//失踪2,6
变量numbers2=[5,2,3];//缺失1,4
变量编号3=[1,3,4,5,7];//失踪2,6
console.log(findMissingElements(number));//返回2,6
console.log(findMissingElements(numbers2));//返回1,4

console.log(findMissingElements(numbers3));//返回2,6
一个效率不高但更直观的解决方案:

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)
}
var n=Math.max.apply(null,arr);//获得最大值
var结果=[];

对于(变量i=1;i
var numbers3=[1,3,4,5,7];//缺少2,6,8
你到底为什么说缺少8?就我们而言,数组是1…7。你是对的!这与问题陈述不匹配。如果你跳过一行中的两个数字,你的函数将只输出第二个数字。谢谢,我现在要检查一下。使用“let”有什么特别的原因吗?
let
是关于作用域,如果我没有弄错的话,它允许更高的函数查看下一个和缺少的部分。@devdropper87没有理由。这是ES6中的一个新功能,我已经开始大量使用。如果您发现在所选环境中出现语法错误,您可以安全地将其更改为
var
。有关
let
的更多信息,请参阅。我尝试使用c出于好奇,将while改为if。为什么它需要一个“while”-这样,如果一行中有多个缺失,它就不会只看第一个缺失的吗?@devdropper87正是。因此,如果你缺失2-5,例如,它不会只拾取2,然后将3与6进行比较。问题引用:序列从1到6n@lex82好的re;已经适应了双重目的。正是我写的答案:)