检查 JavaScript 数组中是否包含连续元素,但无需排序


以上语句要求我们使用 JavaScript 功能检查数组中的元素是否连续,且无需对数组进行排序。我们可以使用一些基本的 JavaScript 功能来解决这个问题。让我们看看如何做到这一点!

什么是数组中的连续元素?

连续元素意味着序列中每个后续元素都应该大于或小于前一个元素。例如,我们有一个数组 [1, 2, 3, 4, 5],在这里我们可以看到数组包含所有连续的元素,因为它们按递增顺序排列,所以输出应为 true,因为它们是连续的。

示例

输入

11 12 13

输出

True

输入

21 11 10

输出

False

上述问题的逻辑

在解决上述问题陈述之前,我们需要了解其背后的逻辑,以便为其创建一个算法。

正如我们上面所讨论的,连续元素应该按递增顺序或递减顺序排列。因此,为了确保给定的序列按这些顺序排列,找到数组的最大和最小元素。然后我们将检查数组的长度,如果数组只有一个元素,则返回 false,否则继续前进。之后,借助 for 循环,我们将迭代所有元素并检查每个元素的条件。

最后,我们将结果以布尔值的形式给出。如果序列遵循升序或降序,则结果显示为 true,否则为 false。

算法

步骤 1 − 开始定义名为 consecutive 的函数,并将输入数组传递给它。

步骤 2 − 继续执行上述步骤,找出输入数组的最小值和最大值。

步骤 3 − 之后检查最大值和最小值的差是否不等于输入数组的长度。如果条件满足,则返回 false。

步骤 4 − 在第四步初始化一个 for 循环,并运行此循环直到数组的长度。

步骤 5 − 最后,显示给定数组的结果为 true 或 false。

示例

//define a function to check elements are consecutive or not
function consecutive(arr) {
  let min = Math.min(...arr);
  let max = Math.max(...arr);
  if (max - min !== arr.length - 1) {
    return false;
  }
  for (let i = 0; i < arr.length; i++) {
    if (arr.indexOf(min + i) === -1) {
      return false;
    }
  }
  return true;
}
//define different arrays with different elements
const arr1 = [1, 2, 3, 4, 5];
const arr2 = [13, 12, 11, 10];
const arr3 = [8, 4, 5, 6, 7, 10];

console.log(consecutive(arr1));
console.log(consecutive(arr2));
console.log(consecutive(arr3));

输出

true
true
false

算法 − 无 for 循环

步骤 1 − 开始查找数组中的最小和最大元素。

步骤 2 − 继续执行第一步,计算连续元素的预期总和。

步骤 3 − 执行第二步后,使用 Javascript 的 reduce 方法计算数组中元素的实际总和。

步骤 4 − 最后比较步骤 2 和步骤 3 的总和,以找出数组是否包含连续项。

示例

//define a function to check elements 
function consecutive(arr) {
  const min = Math.min(...arr);
  const max = Math.max(...arr);
  const expectedSum = (max - min + 1) * (max + min) / 2;
  const actualSum = arr.reduce((sum, num) => sum + num, 0);
  return expectedSum === actualSum;
}

const arr1 = [13, 12, 11, 10];
const arr2 = [8, 4, 5, 6, 7, 10];
const arr3 = [1, 2, 3, 4, 5];

console.log(consecutive(arr1));
console.log(consecutive(arr2));
console.log(consecutive(arr3));

输出

true
false
true

复杂度

我们已经看到两种解决此问题的方法。对于第一种方法,它使用 for 循环,此循环运行到数组的长度。因此,时间复杂度将为 O(n),此代码的空间复杂度将为 O(1),因为它存储一个布尔值,该值占用恒定空间。对于第二种方法,时间复杂度为 O(n),因为该函数迭代数组的所有元素。Math.min 和 Math.max 函数也需要 O(n) 时间。空间复杂度为 O(1),因为存储布尔值。

结论

我们学习了如何检查数组中的元素是否连续。我们创建了两种算法,并看到了不同数组输入的不同输出。两种方法的时间和空间复杂度都相同,均为 O(n) 和 O(1)。

更新于:2023年8月22日

695 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告