【发布时间】:2021-09-30 13:42:54
【问题描述】:
我正在尝试解决一个问题,该问题需要一个数组并将所有零移动到末尾,同时保留其他元素的顺序。
这不是遍历整个数组,任何关于我做错了什么的想法将不胜感激。
let moveZeros = function (arr) {
let newArr = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] === 0) {
newArr.push(arr[i]);
arr.splice(i, 1);
}
}
return arr.concat(newArr);
};
moveZeros([9, 0, 9, 1, 2, 1, 1, 3, 1, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0]);
// expexted to return [9,9,1,2,1,1,3,1,9,9,0,0,0,0,0,0,0,0,0,0]
// currently returns [9,9,1,2,1,1,3,1,9,0,9,0,0,0,0,0,0,0,0,0]
// Strangely... sending a smaller array to the function seems to work.
//moveZeros([false,1,0,1,2,0,1,3,"a"])
// correctly returns[false,1,1,2,1,3,"a",0,0]
【问题讨论】:
-
你知道
arr.splice从数组中删除元素,对吧?所以,for 循环中的i++可能会让你跳过一个元素 -
尝试
arr.splice(i--, 1);- “较短”输入似乎起作用的原因是您的“较短”输入从不连续有 2 个零 -
很好的例子说明为什么在循环遍历数组时更改数组的长度可能不是最好的主意。
-
尝试找到一个失败的例子并开始调试。
标签: javascript algorithm sorting for-loop iteration