将数组中的0移动到末尾
- 只移动0,其他顺序不变
- 必须在原数组上操作
// 嵌套循环O(n^2)
function moveZero(arr){
const length = arr.length
if(length === 0) return
let zeroLength = 0
for(let i=0;i<length-zeroLength;i++){
if(arr[i] === 0){
arr.push(0)
arr.splice(i,1) //O(n)
i-- // 截取了一个数,要进行i++
zeroLength++ // 最后0的个数,就不要遍历了
}
}
}
let arr = [1,0,0,2]
moveZero(arr)
console.log(arr);
双指针
- 定义j指向第一个0,i指向j后面的第一个非0
- 交换i和j的值,继续向后移动
- 只遍历一次,复杂度为O(n)
// 双指针
function moveZero(arr){
const length = arr.length
if(length === 0) return
let i // 指向第一个非0
let j = -1 // 指向第一个0
for(i=0;i<length;i++){
if(arr[i]===0){
// 第一个0赋值给j
if(j<0){
j = i
}
}
if(arr[i]!==0&&j>=0){
// 交换
const n =arr[i]
arr[i] = arr[j]
arr[j] = n
j++
}
}
}
如果可以不在原数组操作
// 如果可以不在原数组操作
function moveZero(arr){
const part1 = []
const part2 = []
for(i=0;i<arr.length;i++){
if(arr[i] === 0){
part2.push(0)
}else{
part1.push(arr[i])
}
}
return arr = [...part1,...part2]
}