将数组中的零移到最后


问题描述:将数组中的零移到最后位,且其它数相对位置不变。要求不能新建数组。

//输入
[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))

文章作者: iamfugui
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 iamfugui !
评论