请教:如何理解《Eloquent JavaScript》中的reverseArrayInPlace数组反转方法?
手动实现数组原地反转的逻辑解析
这个reverseArrayInPlace函数的核心是原地修改原数组完成反转,不用创建新数组,下面拆解每一步的逻辑:
循环边界的设计:
for (let i = 0; i < Math.floor(array.length / 2); i++)
之所以只循环到数组长度的一半(用Math.floor取整),是因为每次循环会交换一对对称位置的元素:第i个元素和倒数第i+1个元素。如果循环整个数组长度,已经交换好的元素会被再次交换回去,等于做无用功。比如数组长度为4时,循环2次就完成所有元素交换;长度为5时,中间的第3个元素不需要动,循环2次就够。元素交换的逻辑:
- 先用
let old = array[i]把当前位置的元素存到临时变量里,避免直接覆盖后丢失原数据 - 把数组末尾对应位置的元素
array[array.length - 1 - i]赋值给array[i],完成前半部分位置的替换 - 再把临时变量
old赋值给array[array.length - 1 - i],完成后半部分位置的替换,这样就完成了一对对称元素的交换
- 先用
实际运行例子(以输入
[1,2,3,4]为例):- 第一次循环i=0:交换
array[0](1)和array[3](4),数组变为[4,2,3,1] - 第二次循环i=1:交换
array[1](2)和array[2](3),数组变为[4,3,2,1] - 此时
Math.floor(4/2)=2,i递增到2,不满足i<2的条件,循环结束,返回反转后的数组
- 第一次循环i=0:交换
另外,函数里的console.log(array[array.length - 1 - i])只是打印每次要交换的目标元素,对反转逻辑没有影响,去掉也能正常运行。
内容的提问来源于stack exchange,提问作者fatemeh lohrasbi
相关产品推荐
相关产品推荐

