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
方法 – 无需循环
步骤 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)。