如何使用循环原地重排数组,修复JS实现代码的逻辑错误
代码逻辑疏漏点
你的遍历逻辑只对每个下标位置做单次校验处理,交换后当前位置新得到的非-1元素不会被二次校验,导致部分元素永远无法被放到正确位置。
具体错误复现:
以你给出的测试数组为例:
- 遍历到
i=1时,当前元素是8,交换arr[1]和arr[8],交换后arr[1]的值变成0 - 你的循环直接执行
i++进入i=2的判断,留在i=1位置的0再也没有机会被处理到下标0的位置,最终结果不符合预期。
修正方案
只需要在每个下标位置增加循环校验,直到当前位置的元素是-1或者已经处于正确位置,再进入下一个下标的判断:
let arr = [-1, 8, -1, 6, -1, 4, -1, 2, 0, -1]; for (let i = 0; i < arr.length; i++) { // 循环处理当前i位置的元素,直到无需处理再往下走 while (arr[i] !== -1 && arr[i] !== i) { const targetIndex = arr[i]; // 交换元素 [arr[i], arr[targetIndex]] = [arr[targetIndex], arr[i]]; } } console.log(arr); // 输出 [0,-1,2,-1,4,-1,6,-1,8,-1]
内容的提问来源于stack exchange,提问作者brk
相关产品推荐
相关产品推荐

