Найти недостающее число в последовательности чисел
Я пытаюсь выяснить, как найти первое отсутствующее число последовательности чисел, как это (1,2,3,5,6,9,10,15)
Я хочу поместить первое отсутствующее число, #4, в переменную для последующего использования, но не знаю, как это сделать?
Я пробовал это, но это дает мне только последнее число:
var mynumbers=new Array(1,2,3,6,9,10);
for(var i = 1; i < 32; i++) {
if(mynumbers[i] - mynumbers[i-1] != 1) {
alert("First missing number id: "+mynumbers[i]);
break;
}
}
во-первых, он дает мне первое число после "дыры" в numbersequence, во-вторых, он продолжает предупреждать все числа, приходящие после "дыра", если я не вставлю перерыв. Я хочу только первый недостающее количество из numbersequence из 1 - 32. Как мне это сделать?
надеюсь на помощь и заранее спасибо ;-)
8 ответов
Как насчет этого
var mynumbers = new Array(1,2,3,6,9,10);
var missing;
for(var i=1;i<=32;i++)
{
if(mynumbers[i-1] != i){
missing = i;
alert(missing);
break;
}
}
решения O(n) просты, но это общий вопрос интервью и часто ищем O (log n) решение времени. Вот код javascript. Это в основном модифицированный двоичный поиск.
function misingNumInSeq(source, min = 0, max = source.length - 1){
if(min >= max){
return min + 1;
}
let pivot = Math.floor((min + max)/2);
// problem is in right side. Only look at right sub array
if(source[pivot] === pivot + 1){
return misingNumInSeq(source, pivot + 1, max);
} else {
return misingNumInSeq(source, min , pivot);
}
}
выход
misingNumInSeq([1,2,3,5,6,9,10,15])
4
By if(mynumbers[i] - mynumbers[i-1] != 1)
, ты хочешь сказать, что серия всегда будет увеличиваться на 1
?
var missing = (function (arr) {
var i;
for (i = 0; i < arr.length; ++i) {
if (i + arr[0] !== arr[i]) return i + arr[0];
}
if (i < 32) // if none missing inside array and not yet 32nd
return i + arr[0]; // return next
}([1,2,3,6,9,10])); // 4
alert(missing);
вам понадобится перерыв, несмотря ни на что. Вот для чего он существует: чтобы остановить цикл от продолжения до конца. И вы должны использовать длину массива вместо жесткого кодирования 32 в качестве конечного условия, потому что ваши номера доходят только до 32, но в списке, возможно, есть отверстия, поэтому в массиве не будет 32 элементов.
поскольку вы знаете, что каждый элемент должен быть на 1 больше, чем предыдущий элемент, затем в отверстие явно mynumbers[i - 1] + 1
.
var mynumbers = new Array(1,2,3,6,9,10);
for(var i = 1; i < mynumbers.length; i++) {
if(mynumbers[i] - mynumbers[i-1] != 1) {
alert("First missing number id: " + (mynumbers[i - 1] + 1));
break;
}
}
EDIT: это справедливо только для отсутствующего числа, не являющегося 1. Чтобы поймать это, вам нужно будет проверить if (mynumbers[0] != 1)
Edit:
function findFirstMissing(array) {
for (var i = 0; i < array.length; i++) {
if (i+1 !== array[i]) {
return i+1;
}
}
}
function findFirstMissing(array) {
for (var i = 0; i < array.length; i++) {
if (array[i+1] - array[i] !== 1) {
return array[i] + 1;
}
}
}
Если вы делаете это таким образом, то хранить его в переменной прост:
var missing = findFirstMissing(array);
const firstNonConsecutive = arr => arr.find((el, i, arr) => (arr[i] - arr[i-1]) !== 1 && i !== 0)
это решение работает для массива положительных чисел.
решение с использованием массива.уменьшить, чтобы найти первое положительное отсутствующее целое число.
function solution(A) {
return [...A].sort().reduce((acc, curr, i, arr) => {
if (acc > curr) {
arr.splice(1);
return acc;
}
else if (arr[i + 1] - curr > 1 || arr.length === i + 1) {
arr.splice(1);
return curr + 1;
}
return acc;
}, 1);
}
и вот несколько тестов:
console.log('solution([1, 3, 6, 4, 1, 2])', solution([1, 3, 6, 4, 1, 2]) === 5)
console.log('solution([1, 3, 2, 8, 4])', solution([1, 3, 2, 8, 4]) === 5)
console.log('solution([1])', solution([1]) === 2)
console.log('solution([-1])', solution([-1]) === 1)
console.log('solution([0])', solution([0]) === 1)
console.log('solution([-1, -4, -5, -6, -190343])', solution([-1, -4, -5, -6, -190343]) === 1)
for(var i = 1; i < mynumbers.length; i++) {
if(mynumbers[i] - mynumbers[i-1] != 1) {
alert("First missing number id: "+mynumbers[i-1]+1);
i = mynumbers.length; // Replace the break
}
}
Если вы хотите, вы можете добавить первоначальная проверка : if (mynumbers[0] != 1) { ... }