问题描述:将数组中的零移到最后位,且其它数相对位置不变。要求不能新建数组。
//输入
[2,6,0,0,8,0,12]
//输出
[2,6,8,12,0,0,0]
方法一:移除填补法
遍历发现0移除并填补到最后位置。
let arr = [2,6,0,0,8,0,12];
function zeroMoveLast(arr){
let count =0;
for(let i =0;i<arr.length-count;i++){
if(arr[i]==0){
arr.splice(i,1);
arr.push(0)
i--;//避免数组塌陷带来的遍历不完全
count++;//避免移除后面填补的0
}
}
return arr;
}
console.log(zeroMoveLast(arr))
方法二:类冒泡交换法
此方法不使用api,性能最优
设置一个index记录0的个数, 当遍历0的个数不为0 且 下标到非0元素时,这时是可交换的。此时用下标 减去0的个数 就等于最前面0的下标(应该好理解吧),那么将他们两两交换,就可以让非0冒泡向前。
[0,0,1] i项为0,不交换,index++,此时i=0 index=1
[0,0,1] i项为0,不交换,index++,此时i=1 index=2
[0,0,1] i项不为0,交换,此时i=2 index=2
let arr = [2,6,0,0,8,0,12]
function zeroMoveLast(arr){
let index = 0;
for(let i=0; i<arr.length; i++) {
//将0统计
if(arr[i] ===0 ) {
index++;
//项不为0 且 已统计0数量不等于0的时候 进行交换
}else if (index !== 0){
//
arr[i - index] = arr[i]
arr[i] = 0
}
}
return arr;
}
console.log(zeroMoveLast(arr))