在 JavaScript 中检查数组中的项是否连续但不排序

javascriptweb developmentfront end technologyobject oriented programming

在上面的语句中,我们被要求借助 javascript 功能检查数组中的项是否连续而不对数组进行排序。我们可以用 javascript 的一些基本功能来解决这个问题。让我们看看怎么做!

数组中的连续项是什么?

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

示例

输入

11 12 13

输出

True

输入

21 11 10

输出

False

上述问题的逻辑

在解决上述问题陈述之前,我们需要了解其背后的逻辑,以便为它。

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

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

算法

步骤 1 - 首先定义名为 Continuous 的函数并在其中传递一个输入数组。

步骤 2 - 转发到上面的步骤,找出输入数组的最小值和最大值。

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

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

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

示例

//定义一个函数来检查元素是否连续
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;
}
//定义具有不同元素的不同数组
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 的总和,以确定数组是否包含连续项。

示例

//定义一个函数来检查元素
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)。


相关文章