#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; }
Есть некоторые проблемы с вашей логикой.
- Во-первых, вы ожидаете пропущенных чисел до 9, которые отсутствуют в вашем состоянии while.
- Вы не сбрасываете переменную j, как только выходите из цикла while.
- Вы увеличиваете 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]))