Найти недостающее число в последовательности чисел

Я пытаюсь выяснить, как найти первое отсутствующее число последовательности чисел, как это (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) { ... }