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] } } } }


浙公网安备 33010602011771号