思路一:
/**
* 只移动0,其他顺序不变
* 必须在原数组进行操作
* 262ms
*/
function moveZero1(arr:number[]):void{
const length=arr.length
if(length===0) return
let zeroLength=0
//O(n^2)
for(let i=0;i<length-zeroLength;i++){
if(arr[i]===0){
arr.push(0)
arr.splice(i,1) //O(n)
i-- //数组截取了一个元素,i要递减 否则连续0会出错
zeroLength++ //累加0的长度
}
}
}
思路二:
/**
* 双指针
* 定义j指向第一个0 i指向j后面的第一个非0
* 交换i j的值,继续向后移动
* 只遍历一次
* 3ms
*/
function moveZero2(arr:number[]):void{
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
if(j<0){
j=i
}
}
if(arr[i] !==0 && j>=0){
//交换
const n=arr[i]
arr[i]=arr[j]
arr[j]=n
j++
}
}
}