首页 > 解决方案 > Javascript:在数组中查找连续数字时保持关闭

问题描述

我正在做一些编码练习,并在网上发现了一些问题。
在寻找返回数组中连续数字的数量时,我不断得到比预期低 1 个整数。

function LongestConsecutive(arr) { 

  arr.sort((a,b) => {return a-b});

  let highest = 0;
  let counter = 0;
  let prevNum;

  arr.forEach((num,index,arr) => {
      if (prevNum === undefined) {
        prevNum = num   
      } else {

          if (num + 1 == arr[index + 1]) {
              counter += 1;
              highest = Math.max(highest,counter)
          } else {
             counter = 0;
          } 
      }
  })
  return highest;      
}

例如,输入 [5, 6, 1, 2, 8, 9, 7] 应该返回 5——因为在排序时,有 5 个连续的数字。我一直比我应该得到的低一个,所以对于这个例子,我得到 4。得到正确答案的唯一方法是当我返回“最高 + 1”时,这显然是在避免这个问题。

标签: javascriptarrays

解决方案


第一次迭代将命中

if (prevNum === undefined) {
  prevNum = num;
}

但这不是第一个连续的数字吗?所以应该在这里counter = 1;highest = 1;

接下来,您counter = 0;在一个else案例中重置。为什么?至少有一个数字是连续的,因此请将其重置为1

然后,您并没有真正prevNum用于任何事情。if (prevNum === undefined)可以替换为if (index === 1)

然后检查当前数字 ( num) 是否在下一个数字 ( ) 之前arr[index + 1],但跳过对第一个索引的检查。如何检查当前号码是否成功?

此代码使用上述更改以及一些代码质量更改:

function longestConsecutive(arr) { // Non-constructor functions start with a lower-case letter
  arr.sort((a, b) => a - b); // Use expression form

  let highest = 0;
  let counter = 0;

  arr.forEach((num, index, arr) => {
    if (index === 0) {
      highest = 1;
      counter = 1;
    } else if (num - 1 === arr[index - 1]) { // Merge `else if`, use strict equal
      counter += 1;
      highest = Math.max(highest, counter);
    } else {
      counter = 1;
    }
  });

  return highest;
}

推荐阅读