首页 > 解决方案 > 编写一个函数来判断一个数组是否包含至少 N 个数字的连续数字

问题描述

我正在尝试编写一个函数来确定数组是否包含至少 N 个数字的连续数字。比如输入是[1,5,3,4]and 3,它会转,true因为数组有3连续的数字,也就是[3,4,5]

这里这个函数需要预先排序,在我看来这不是最有说服力的解决方案。有人可以看看并对此进行一些改进吗?

function hasConsecutiveNums(array, N) {
  if (array.length < N) return false;
  if (N === 0) return true;
  const sortedArray = array.slice().sort((a, b) => a - b);
  let count = 0;
  let prev = null;
  for (const num of sortedArray) {
    if (prev && num === prev + 1) {
      count++;
    } else {
      count = 1;
    }
    if (count === N) return true;
    prev = num;
  }

  return false;
}

console.log(hasConsecutiveNums([1, 4, 5, 6], 3)) // true
console.log(hasConsecutiveNums([1, 4, 5, 6], 4)) // false

标签: javascriptarraysalgorithmdata-structures

解决方案


你可以做一些改变

  • 初始化prev(如果添加数字undefinednull则作为数字零),这允许
  • 省略检查prev
  • 在第一条语句中移动检查计数,if如果找到想要的递增计数,请提前退出。

function hasConsecutiveNums(array, N) {
  if (array.length < N) return false;
  if (N === 0) return true;
  const sortedArray = array.slice().sort((a, b) => a - b);
  let count = 0;
  let prev = undefined;
  for (const num of sortedArray) {
    if (num === prev + 1) {
      if (++count === N) return true;
    } else {
      count = 1;
    }        
    prev = num;
  }
  return false;
}

console.log(hasConsecutiveNums([1, 4, 5, 6], 3)) // true
console.log(hasConsecutiveNums([1, 4, 5, 6], 4)) // false


推荐阅读