Целые числа из заданного диапазона, не входящие в массив

Целые числа из заданного диапазона, не входящие в массив


Ответ:

const getMissingNumbers = (arr) => {
  const len = arr.length;
  for (let i = 0; i < len; i++) {
    const index = Math.abs(arr[i]) - 1;

    if (arr[index] > 0) {
      arr[index] *= -1;
    }
  }

  const result = [];
  for (let i = 0; i < len; i++) {
    if (arr[i] > 0) {
      result.push(i + 1);
    }
  }

  return result;
};

Обьяснение:

Так как размер массива равен N, а диапазон чисел — это положительные числа от 1 до N, то пометить элементы мы можем отрицательным значением.

Алгоритм

  1. Проходим по массиву: каждый элемент массива — это index в массиве [1, N]. Помечаем arr[index] = (-1) * arr[index];
  2. Проходим по значениям от 1 до N: добавляем в результирующий массив элементы исходного массива, которые больше 0.


Код для проверки:

const getMissingNumbers = (arr) => {
  const len = arr.length;
  for (let i = 0; i < len; i++) {
    const index = Math.abs(arr[i]) - 1;

    if (arr[index] > 0) {
      arr[index] *= -1;
    }
  }

  const result = [];
  for (let i = 0; i < len; i++) {
    if (arr[i] > 0) {
      result.push(i + 1);
    }
  }

  return result;
};

console.log(getMissingNumbers([4, 3, 2, 7, 8, 2, 3, 1])); // [5,6]
console.log(getMissingNumbers([1, 1])); // [2]
console.log(getMissingNumbers([1, 2])); // []


Report Page