检查 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)。