我正在尝试编写代码,在不使用reverse函数的情况下反转一个数组(我正忙于学习JS,所以只是做一个来自雄辩的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]
,所以如果我调用ReverseRayInPlace([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;
}
谁能解释一下解决方案中发生了什么,这样我就能更好地理解了? 谢谢:)
下面是这个函数中发生的事情:
用于(设i=0;i
他们使用Math.flood()
方法来确保您只遍历数组的一半。 这就是为什么您最初的解决方案重复了元素,而不是颠倒它们。
让旧=数组[i]
:
这是一个临时变量,用于在交换元素时保存循环中当前索引处的元素。
array[i] = array[array.length - 1 - i];
array[array.length - 1 - i] = old;
这将交换元素。
只留下返回数组;
您只需要循环数组的一半,因为您正在交换项; 如果对整个数组进行循环,则会对每个项进行两次交换,而根本不改变数组。 在每个迭代中,您只需复制反射索引处的值,而不是调换这两个值,对于这两个值,您需要一个临时变量来存储其中一个值。
假设您有一个数组[1,2,3,4,5]。 代码从最左边的元素开始,然后与最右边的元素交换。 得到[5,2,3,4,1]。 然后它对数组中的下一个元素执行同样的操作,将它与右边第二个元素交换,得到[5,4,3,2,1]。 Math.flood(array.length)
确保已经交换的元素不会再次交换,这样它将只遍历数组的前半部分。