在不改变某些元素位置的情况下反转 JavaScript 数组


在这个问题陈述中,我们的目标是编写一个使用 Javascript 反转数组的函数,同时不改变某些元素的位置。为此,我们将跟踪保留元素的索引。

理解问题陈述

问题是创建一个 Javascript 函数来反转数组,但数组中的某些元素必须保持其位置不变。因此,这些元素在原始数组和反转数组中的位置应该相同。

例如,假设我们有一个数组 [1, 2, 3, 4, 5, 6]。如果我们想使用 Javascript 中内置的 reverse 函数反转此数组,我们将得到 [6, 5, 4, 3, 2, 1]。但是,如果我们必须保留元素 [2, 4, 6] 的位置,那么反转后的数组将如下所示:[6, 5, 3, 4, 2, 1]。

因此,我们的目标是找到能够满足上述要求的反转数组的算法。

上述问题的逻辑

实现上述问题有多种方法。这里关键的想法是跟踪保留项的位置,并在需要时将其与反转数组中的对应项交换。

该函数将接收数组和要保留的元素数组作为输入,并返回一个新数组,该数组是所述数组的反转,但保留了元素。完成此操作后,我们将使用 reverse 方法创建数组的反转副本。然后遍历原始数组的索引,并检查每个索引是否引用保留项的索引。如果条件为真,则只需继续执行下一个元素,而不更改位置。如果条件为假,则只需交换它以反转它。

算法

步骤 1 - 创建一个函数来反转数组的元素,而不改变保留数组的位置。

步骤 2 - 使用一个变量来存储保留元素的索引。

步骤 3 - 使用 reverse 方法反转实际输入数组的元素。

步骤 4 - 使用 for 循环使用 i 遍历输入数组的项。在循环内部,检查条件,如果保留索引具有 i 索引,则继续。

步骤 5 - 如果上述条件不为真,则使用 arr.length - 1 -i 计算反转数组中的索引,并检查它是否属于保留项。

步骤 6 - 如果它不属于,则算法将使用解构赋值将项交换到其原始位置。

算法代码

function reverseArray(arr, preservePosition) {
   const preservedIndex = new Set(preservePosition.map((el) => arr.indexOf(el)));
   const reversedArr = arr.reverse();
   for (let i = 0; i < arr.length; i++) {
      if (preservedIndex.has(i)) {
      continue;
      }
      const reversedIndex = arr.length - 1 - i;
      if (preservedIndex.has(reversedIndex)) {
         // swap the elements in their original positions
         [reversedArr[i], reversedArr[reversedIndex]] = [arr[i], arr[reversedIndex]];
      }
   }
   return reversedArr;
}
const arr = [12, 22, 35, 44, 52, 35, 68];
const preservePosition = [22, 44, 68];
const reversedArr = reverseArray(arr, preservePosition);
console.log(reversedArr);

复杂度

实现算法的时间复杂度为 O(n),其中 n 是数组的长度。因为算法对数组中的每个元素执行恒定的工作量。空间复杂度也是 O(n),因为我们只存储大小为 n 的反转数组。

结论

以上代码提供了一种有效的解决方案,可以在 Javascript 中反转数组,而无需更改某些项的实际位置。因此,它具有 O(n) 的时间复杂度和 O(n) 的空间复杂度。

更新于:2023年5月18日

469 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始
广告