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)
确保已经交换的元素不会再次交换,因此它只会经过数组的前半部分。
我正在尝试编写不使用反转函数就地反转数组的代码(我正忙于学习 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)
确保已经交换的元素不会再次交换,因此它只会经过数组的前半部分。