leetcode 每日一题 1089. 复写零

leetcode 每日一题 1089. 复写零

func duplicateZeros(arr []int)  {
    for i := 0; i < len(arr); i++ {
        if arr[i] != 0 {
            continue
        }
        for j :=  len(arr) - 2 ; j > i ; j--{
            arr[j+1] = arr[j]
        }
        if i + 1 < len(arr){
            arr[i+1] = 0
        }
        i++
    }
}

 优化一下,从最后一个元素开始,走一次循环,找到这个元素前面有多少个0并保存,表示需要右移的位数, 这个元素的前一个非0元素 和他一样的移动位数,前一个元素为0则有当前元素需要移动的位数-1

func duplicateZeros(arr []int)  {
    //记录当前下标前面出现了几个0
    buf := 0
    len := len(arr)
    for i := len - 2 ; i >= 0 ; i-- {
        if arr[i] == 0 {
            buf++
        }
    }
    //移动元素
    for i := len - 2 ; i >= 0 ; i-- {
        if arr[i] == 0 {
            buf--
            if i + buf  < len{
                arr[i + buf] = arr[i]
            }
            if i + buf + 1  < len{
                arr[i + buf + 1] = 0
            }
        }else {
            if i + buf < len{
                arr[i + buf] = arr[i]
            }
        }
    }
}

 

posted @ 2022-06-17 08:59  java架构师1  阅读(22)  评论(0)    收藏  举报