算法:移动数组中出现的0,并且移动到末尾
思路1:
时间复杂度为O(n^2)(不建议使用)-->原因:便利时间复杂度为O(n),arr.splice的时间复杂度也为O(n),合起来复杂度就为O(n^2)
例如数组 let arr = [1, 2, 0, 3, 0, 5, 7, 0, 9];
const moveZrrer1 = () => {
let arr = [1, 2, 0, 3, 0, 5, 7, 0, 9]
if (arr.length === 0) return
let zrrorLength = 0
for (let i = 0
if (arr[i] === 0) {
arr.push(0)
arr.splice(i, 1)
zrrorLength++
}
}
console.log(arr)
}
打印出来的结果是:

出现问题:如果数组是连续的0,例如:let arr = [1, 2, 0, 0, 0, 3, 0, 5, 7, 0, 9]
结果就是:

方案:在截取数组后减去一位元素
const moveZrrer1 = () => {
let arr = [1, 2, 0, 0, 0, 3, 0, 5, 7, 0, 9]
if (arr.length === 0) return
let zrrorLength = 0
for (let i = 0
if (arr[i] === 0) {
arr.push(0)
arr.splice(i, 1)
i--
zrrorLength++
}
}
console.log(arr)
}

思路2(推荐):
时间复杂度为O(n)-->只有一次遍历,时间复杂度为O(n);
const moveZrrer2 = (arr) => {
// let arr = [1, 2, 0, 3, 0, 5, 7, 0, 9]
// let arr = [1, 2, 0, 0, 0, 3, 0, 5, 7, 0, 9]
if (arr.length === 0) return
let i
let j = -1
for (i = 0
if (arr[i] === 0) {
if (j < 0) {
j = i
}
}
}
if (arr[i] !== 0 && j > 0) {
let n = arr[i]
arr[i] = arr[j]
arr[j] = n
}
}