JavaScript数组后半部分反转代码异常,请求排查修正
问题分析与修复
你的代码核心问题是错误地将后半部分元素与前半部分元素交换,而非反转后半部分本身。我们需要调整循环的索引逻辑,只针对数组的后半段进行首尾对应位置的交换。
原代码问题点
- 循环中
j的初始值设为(n/2)-1,指向的是前半部分的最后一个元素,导致后半部分元素和前半部分元素交换,偏离了反转后半部分的目标。 - 循环条件
i < n/4逻辑错误,应该基于后半部分的长度来确定交换次数,而非数组总长度的1/4。
修复后的代码
方案一:while循环实现(更直观)
let a = [5, 17, 11, 10, 12, 6]; let n = a.length; const halfStart = Math.floor(n / 2); // 后半部分起始索引 let left = halfStart; let right = n - 1; // 反转后半部分:交换后半部分首尾对应元素 while (left < right) { const temp = a[left]; a[left] = a[right]; a[right] = temp; left++; right--; } // 输出结果 for (let i = 0; i < n; i++) { console.log(a[i]); }
方案二:for循环实现(更紧凑)
let a = [5, 17, 11, 10, 12, 6]; let n = a.length; const halfStart = n / 2; // 示例数组长度为偶数,直接取n/2即可 const halfLength = n - halfStart; for (let i = 0; i < Math.floor(halfLength / 2); i++) { const leftIdx = halfStart + i; const rightIdx = n - 1 - i; const temp = a[leftIdx]; a[leftIdx] = a[rightIdx]; a[rightIdx] = temp; } // 输出结果 for (let i = 0; i < n; i++) { console.log(a[i]); }
运行结果
执行修复后的代码,输出为:
5 17 11 6 12 10
完全符合预期结果。
通用说明
如果数组长度为奇数(比如[1,2,3,4,5]),上述代码依然可以正确反转后半部分(后半部分为[3,4,5],反转后变成[5,4,3],最终数组为[1,2,5,4,3]),具备更好的通用性。
内容的提问来源于stack exchange,提问作者Sougata Mukherjee
相关产品推荐
相关产品推荐

