JavaScript - 就地反转数组

JavaScript - reverse array in place

我正在尝试编写不使用反转函数就地反转数组的代码(我正忙于学习 JS,所以只是从 Eloquent JavaScript 做一个练习)。

  function reverseArrayInPlace(arr) {
   for (let i = 0; i < arr.length; i++) {
    arr[i] = arr[(arr.length - 1) - i];
  }

  return arr;
}

这是我写的代码,但不太有效,我知道这是因为我已经重新分配了 arr[0]arr[1],所以如果我调用 reverseArrayInPlace([1, 2, 3, 4 ,5])[5, 4, 3, 4, 5] 返回。

这是给出的解决方案:

function reverseArrayInPlace(array) {
  for (let i = 0; i < Math.floor(array.length / 2); i++) {
    let old = array[i];
    array[i] = array[array.length - 1 - i];
    array[array.length - 1 - i] = old;
  }
  return array;
}

任何人都可以解释一下解决方案中发生了什么,以便我更好地理解吗?谢谢:)

你只需要遍历数组的一半,因为你正在交换项目;如果你遍历整个数组,你将交换每个项目两次,根本不改变数组。在每次迭代中,您只需复制反射索引处的值,而不是转置这两个值,为此您需要一个临时变量来存储其中一个值。

所以这里是这个函数中发生的事情:

for(let i = 0; i < Math.floor(array.length / 2); i++):

他们正在使用 Math.floor() 方法来确保您只迭代数组的一半。这就是为什么您的原始解决方案重复元素而不是反转元素的原因。

let old = array[i]:

这是一个临时变量,用于在交换元素时将元素保存在循环中的当前索引处。

array[i] = array[array.length - 1 - i];
    array[array.length - 1 - i] = old;

这会交换元素。

只剩下 return array;

假设您有一个数组 [1, 2, 3, 4, 5]。代码从最左边的元素开始,并将它与最右边的元素交换。所以你得到 [5, 2, 3, 4, 1]。然后它对数组中的下一个元素做同样的事情,将它与倒数第二个元素交换,你会得到 [5, 4, 3, 2, 1]。 Math.floor(array.length) 确保已经交换的元素不会再次交换,因此它只会经过数组的前半部分。