在不改变某些元素位置的情况下反转 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) 的空间复杂度。