отсутствующие целые числа из отсортированного массива

#javascript #loops

Вопрос:

  • У меня есть массив отсортированных чисел, передаваемых в мою функцию
  • Я хочу вернуть номер numbers , которого мне не хватает

Пример:

массив, который я передаю, равен [1,5,6,9]

мне не хватает цифр 2,3,4,7,8

счетчик должен быть 5

то, что я пытаюсь сделать:

без использования каких-либо встроенных модулей. хотя мой следующий номер в моем списке не является следующим номером уже в моем списке, я бы увеличил его на единицу.


 function missing(numbers){  counter = 0;  let j = 1;  for(let i = 0; ilt;numbers.length; i  ){  while(numbers[i 1] != numbers[i] j){  j =1;  counter =1;  console.log("missing "  numbers[i] j)  }  } return counter; }  

Ответ №1:

Я бы предложил использовать a Set , чтобы содержать все числа во входном массиве, а затем создать массив диапазона всех возможных чисел, соответствующих этому массиву.

Мы делаем это, сначала получая минимальное и максимальное значение нашего входного массива, а затем генерируя диапазон от минимального до максимального.

Затем мы используем Array.filter() для удаления всех элементов в массиве диапазонов в нашем исходном массиве (в наборе)

 function getMissingNumbers(arr) {  const [min,max] = [Math.min(...arr), Math.max(...arr)];  const range = Array.from({ length: (max - min   1)}, (v,k) =gt; k   min);  const nSet = new Set(arr);  return range.filter(n =gt; !nSet.has(n)); }  console.log(getMissingNumbers([1,5,6,9])) console.log(getMissingNumbers([1,5])) console.log(getMissingNumbers([2,3,4,5,8,9])) 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

И немного более простая версия (при условии сортировки массивов):

 function getMissingNumbers(arr) {  let s = new Set(arr);  let range = Array.from({ length: (arr[arr.length-1] - arr[0])}, (v,k) =gt; k   arr[0]);  return range.filter(n =gt; !s.has(n)); }  console.log(getMissingNumbers([1,5,6,9])) console.log(getMissingNumbers([1,5])) console.log(getMissingNumbers([2,3,4,5,8,9])) 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

Комментарии:

1. слишком много повторений.

2. Я добавил версию с меньшим количеством итераций, хотя я думаю, что если мы говорим о нескольких числах, время выполнения в любом случае будет одинаковым!

Ответ №2:

Вы можете взять один цикл и выполнить его от нуля индекса до конца данного массива.

В то же время используйте переменную для увеличения значения и, если ее нет в массиве, переместите это значение в результирующий набор пропущенных значений.

 function getMissing(array) {  let i = 0,  v = array[0],  result = [];    while (i lt; array.length) {  if (v === array[i]) {  i  ;  v  ;  continue;  }  result.push(v  );  }  return result; }   console.log(...getMissing([1, 5, 6, 9])); // 2 3 4 7 8 

Ответ №3:

 function missing(numbers){  counter = 0;    for(let i = 0; ilt;numbers.length; i  ){  let j = 1;  while(numbers[i 1] != numbers[i] j amp;amp; numbers[i] j lt; 10){  console.log(`missing   ${numbers[i] j}`, numbers[i], j)  j =1;  counter =1;  }  }  return counter; }  

Есть некоторые проблемы с вашей логикой.

  1. Во-первых, вы ожидаете пропущенных чисел до 9, которые отсутствуют в вашем состоянии while.
  2. Вы не сбрасываете переменную j, как только выходите из цикла while.
  3. Вы увеличиваете j до того, как оператор печати выдаст вам неправильные значения, которые могли бы не выполнить условие while.

Ответ №4:

Вы также можете попробовать использовать 2 петли внутри друг друга

 function missingNumbers(arr) {  const arr2 = [];  for (let i = arr[0]; i lt;= arr[arr.length - 1]; i  ) {  arr2.push(i);  }  if (arr.length === arr2.length) {  return [];  }  for (let i = 0; i lt; arr2.length; i  ) {  for (let j = 0; j lt; arr.length; j  ) {  if (arr2[i] === arr[j]) {  arr2.splice(i, 1);  }  }  }  return arr2;  }    console.log(missingNumbers([1,5,6,9]))  console.log(missingNumbers([1,5]))  console.log(missingNumbers([2,3,4,5,8,9]))  console.log(missingNumbers([1,2]))