Codewars Challenge - JavaScript - Найти первое непоследовательное число в массиве - PullRequest
2 голосов
/ 17 февраля 2020

Ссылка на вызов Codewars

Это очень просто c, но по какой-то причине я не могу понять, почему я не могу вернуть null, когда в массиве есть не любых непоследовательных чисел. Мой код работает нормально, когда массив не полностью последовательный:

function firstNonConsecutive(arr) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i + 1] - arr[i] !== 1) {
      return arr[i + 1];
    }
  }
  return null;
}


console.log(firstNonConsecutive([ 0, 1, 2, 3, 4, 6, 7, 8, 9 ]));

Но если массив является последовательным, то есть так:

function firstNonConsecutive(arr) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i + 1] - arr[i] !== 1) {
      return arr[i + 1];
    }
  }
  return null;
}

console.log(firstNonConsecutive([ 6, 7, 8, 9, 10, 11, 12 ]));

Вы видите, что он возвращает undefined вместо null. Почему он не возвращает ноль? Возврат за пределы -10 *.

Я попытался создать начальную проверку, чтобы увидеть, не является ли массив последовательным, например:

function firstNonConsecutive(arr) {
  let newArr = [];
  for (let j = arr[0]; j < arr[arr.length - 1]; j++) {
    newArr.push(j);
  }
  //check if arr does not contain consecutive characters
  if (String(arr) !== String(newArr)) {
    for (let i = 0; i < arr.length; i++) {
      if (arr[i + 1] - arr[i] !== 1) {
        return arr[i + 1];
      }
    }
  }
  else {
    return null;
  }
}
console.log(firstNonConsecutive([ 0, 1, 2, 3, 4, 6, 7, 8, 9 ]));

Но это не имело значения. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 17 февраля 2020

Я предлагаю начать со второго элемента и проверить элемент и элемент перед этим.

Этот подход не меняет длину для проверки и исключает проблему проверки несуществующих элементов.

function firstNonConsecutive(arr) {
    for (let i = 1; i < arr.length; i++) {
        if (arr[i - 1] + 1 !== arr[i]) return arr[i];
    }
    return null;
}

console.log(firstNonConsecutive([0, 1, 2, 3, 4, 6, 7, 8, 9]));
console.log(firstNonConsecutive([0, 1, 2, 3, 4, 5, 6, 7, 8]));
1 голос
/ 17 февраля 2020

Вы можете попробовать Array.prototype.find() пробел:

const firstNonConsecutive = arr => arr.find((n,i,s) => i && n-s[i-1] > 1)

Итак, это модифицированная версия, которая будет пропускать массивы без пробелов и массивы с негативами, будет выглядеть так:

const src1 = [1,2,3,4,6,7,8],
      src2 = [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ],
      src3 = [ -4, -3, -2, 0, 1, 3, 4, 5 ],
      firstNonConsecutive = arr => (
        gap = arr.find((n,i,s) => i && Math.max(n,s[i-1])-Math.min(n,s[i-1]) > 1), 
        gap === undefined ? null : gap
      )
      
console.log(firstNonConsecutive(src1))
console.log(firstNonConsecutive(src2))
console.log(firstNonConsecutive(src3))
.as-console-wrapper{min-height:100%;}

Хотя мой ответ может показаться немного сложным из-за использования Math.min() / Math.max(), он будет работать для последовательных чисел перечислены также в порядке убывания .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...