【问题标题】:Codewars Challenge - JavaScript - Find the first non-consecutive number in ArrayCodewars Challenge - JavaScript - 查找数组中的第一个非连续数字
【发布时间】:2020-02-17 16:37:55
【问题描述】:

Link to Codewars challenge

这是非常基本的,但由于某种原因,当数组中没有任何不连续的数字时,我无法弄清楚为什么我无法返回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。为什么它不返回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 ]));

但这并没有什么不同。有什么想法吗?

【问题讨论】:

  • i &lt; arr.length 然后arr[i + 1] 将是未定义的。你会想要i &lt; arr.length - 1
  • 你正在迭代整个数组但访问arr[i + 1],这意味着最后一次迭代的测试总是会失败,然后返回arr[i + 1],即undefined
  • @Keith 谢谢,是的,这就是答案。

标签: javascript arrays for-loop null


【解决方案1】:

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

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

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]));

【讨论】:

  • 将完美地适用于按升序顺序列出的连续数字。
【解决方案2】:

你可以试试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() 的使用,我的回答可能显得有点过于复杂,但它也适用于按降序列出的连续数字 .

【讨论】:

    【解决方案3】:

    我有这样的解决方案:

    function firstNonConNum(arr) {
        const result = arr
            .find((element, i) => {
            if (i < 1) {
                return false
            }
            if ((element - arr[i - 1]) !== 1) {
                return true;
            }
        })
        if (result !== undefined) {
            return result
        }
        return null;
    }
    
    console.log(firstNonConNum([-2, 0, 1, 2, 6, 4, 5, 6, 7 ]));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-23
      • 2020-04-09
      • 2011-12-18
      • 2023-03-10
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      相关资源
      最近更新 更多