Codewars 挑战 - JavaScript - 查找数组中的第一个非连续数字

Spe*_*e43 4 javascript arrays null for-loop

Codewars 挑战链接

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 ]));
Run Code Online (Sandbox Code Playgroud)

但如果数组连续的,即像这样:

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 ]));
Run Code Online (Sandbox Code Playgroud)

您可以看到它返回undefined而不是null. 为什么不返回 null?返回值位于 for 循环之外。

我尝试创建一个初始检查以查看数组是否不连续,如下所示:

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 ]));
Run Code Online (Sandbox Code Playgroud)

但这并没有什么区别。有任何想法吗?

Nin*_*olz 5

我建议从第二项开始,检查元素和之前的元素。

这种方法不会改变要检查的长度,并且忽略了检查不存在元素的问题。

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]));
Run Code Online (Sandbox Code Playgroud)