Javascript: проверка массива чисел на количество пропущенных чисел, необходимых для того, чтобы массив был последовательным - PullRequest
1 голос
/ 23 октября 2019

Работаю над некоторыми вызовами Javascript для Code Signal, и у меня есть проблема, решающая это:

Ратиорг получил статуи разных размеров в подарок от CodeMaster на свой день рождения, каждая статуяимеющий неотрицательный целочисленный размер. Поскольку ему нравится совершенствовать вещи, он хочет расположить их от самых маленьких до самых больших, чтобы каждая статуя была больше, чем предыдущая, ровно на 1. Ему могут потребоваться некоторые дополнительные статуи, чтобы это сделать. Помогите ему определить минимальное количество необходимых дополнительных статуй. Пример Для статуй = [6, 2, 3, 8] вывод должен быть makeArrayConsecutive2 (statues) = 3. Ратиоргу нужны статуи размеров 4, 5 и 7.

Мой подход:

  • Сортировка массива от наименьшего к наибольшему
  • Создание переменной счетчика для хранения количества пропущенных чисел
  • Итерация по массиву
  • Вычитание [i +1] элемент из элемента [i]
  • Если он равен 1, числа являются последовательными, если не числа не являются последовательными (переменная счетчика приращений)
  • Возвращаемая переменная счетчика

Вот мой код:

function makeArrayConsecutive2(statues) {
    // Sorts array numerically smallest to largest
    statues.sort((a, b) => a - b);

    let counter = 0;

    // If array only contains one number return 0
    if(statues.length === 1) {
        return 0;
    }

    /* Iterate through array, subtract the current element from the next element, if it 
       equals 1 the numbers are consecutive, if it doesn't equal one increment the counter 
       variable */
    for(let i = 0; i <= statues.length -1; i++) {
        if(statues[i] !== statues.length -1 && statues[i + 1] - statues[i] != 1) {
           counter++;
        }

       console.log(statues[i]);
       console.log('counter : ' + counter);
    }

    return counter;       
}

Когда statues содержит [5, 4, 6], вывод выглядит так:

4
counter : 0
5
counter : 0
6
counter : 1

Я думаю, проблема в том, что массив находится в последнемэлемент, в данном случае 6, он пытается посмотреть statues[i + 1], когда этот элемент не существует. Я добавил statues[i] !== statues.length -1 в свое заявление if для решения этой проблемы, но, похоже, оно не работает. Что не так с моим кодом и почему последний элемент увеличивает значение счетчика?

1 Ответ

2 голосов
/ 23 октября 2019

Я бы подошел к этому, построив целевой массив, который идет от мин + 1 до макс-1 ввода единицами, исключая элементы ввода .....

function missingConseq(input) {
  let min = Math.min.apply(null, input)
  let max = Math.max.apply(null, input)
  let result = []

  for (i = min+1; i < max; i++) {
    if (!input.includes(i)) result.push(i)
  }
  return result
}

let array = [6, 2, 3, 8]
console.log(missingConseq(array))
...