将数组中的 0 移动到末尾

题目:将数组中的 所有 0 都移动到末尾,如输入[1,0,3,0,11,0],输出[1,3,11,0,0,0]。要求: 

  • 只移动 0, 其他数字顺序不变
  • 考虑时间复杂度
  • 必须在原数组进行操作 

分析:

  传统方式(不可取)

    • 遍历数组
    • 遇到 0 push 到数组末尾
    • 然后用 splice截取掉当前元素
    • 时间复杂度:O(n^2)  

  双指针方式:

    • 指针1 指向第一个0,指针2指向第一个非0
    • 把指针1 和指针2 进行交换
    • 指针后移  

代码实现:

  • 传统方式(不可取,时间复杂度为:O(n^2)):
    复制代码
    /**
     * 移动 0 到数组末尾 -- 嵌套循环
     * @param arr 数组
     */
    export function moveZero(arr: number[]):void{
        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) // 删除当前元素,splice 本身就是O(n)的复杂度
                zeroLength++
                i--// 数组截取了一个元素,i要递减,否则连续0 会有问题
            }
        }
    }
    复制代码
  • 双指针方式 
    复制代码
    /**
     * 移动 0 到数组末尾 -- 双指针
     * @param arr 
     * @returns 
     */
    export function moveZero2(arr: number[]):void{
        const length = arr.length
        if(length === 0 ) return 
        let j = -1; // 第一个为0 的索引值
        let i 
        for(i = 0; i < length; i++){
            if(arr[i] === 0 && j === -1){ //将j 指向第一个为0 的位置
                j = i
            }
            //如果i 所在位置的值不为0 ,就将j 位置的 0 交换;j指向下一个
            if(arr[i] !== 0 && j >= 0){
                arr[j] = arr[i]
                arr[i] = 0
                j++
            }
        }
    }
    复制代码

测试用例:

复制代码
/**
 * @description 移动 0 到数组末尾 测试
 */
import {moveZero,moveZero2} from './moveZero'

describe('移动 0 到数组末尾',()=>{
    it('正常情况', ()=>{
        const arr = [1,0,3,4,0,0,0,11,0]
        moveZero2(arr)
        expect(arr).toEqual([1,3,4,11,0,0,0,0,0])
    })
    it('没有0', ()=>{
        const arr = [1,3,4,11]
        moveZero2(arr)
        expect(arr).toEqual([1,3,4,11])
    })
    it('全是0', ()=>{
        const arr = [0,0,0,0]
        moveZero2(arr)
        expect(arr).toEqual([0,0,0,0])
    })

    it('正常情况', ()=>{
        const arr = [1,0,3,4,0,0,0,11,0]
        moveZero(arr)
        expect(arr).toEqual([1,3,4,11,0,0,0,0,0])
    })
    it('没有0', ()=>{
        const arr = [1,3,4,11]
        moveZero(arr)
        expect(arr).toEqual([1,3,4,11])
    })
    it('全是0', ()=>{
        const arr = [0,0,0,0]
        moveZero(arr)
        expect(arr).toEqual([0,0,0,0])
    })
})
复制代码

 

 

    

 

posted @   yangkangkang  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示