283 移动零 简单
发布者:admin 发表于:439天前 阅读数:520 评论:0

283. 移动零 简单

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

必须在原数组上操作,不能拷贝额外的数组。

尽量减少操作次数。

代码参考:

package main

import "fmt"

func main() {
    moveZeroes([]int{0, 1, 0, 3, 12})
    moveZeroes([]int{0, 0, 1})
    bestMoveZeroes([]int{1, 2, 3, 0, 0, 4})
}

// 辣鸡解法
func moveZeroes(nums []int) {
    n := len(nums)
    rear := n - 1
    for i := 0; i < n; i++ {
        if nums[i] == 0 {
            for j := i; j < rear; j++ { // 后部分全部往前挪动
                nums[j] = nums[j+1]
            }
            nums[rear] = 0
            rear--
            i-- // 原来0的位置上,不知道下一个值是不是0,所以 i--
        }
        if i >= rear {
            break
        }
    }
    fmt.Println(nums)
}

// 快慢指针
// fast 指针在前把所有不是 0 的元素挪动到 slow 指针上
func bestMoveZeroes(nums []int) {
    slow, fast := 0, 0
    for fast < len(nums) {
        if nums[fast] != 0 {
            nums[slow], nums[fast] = nums[fast], nums[slow]
            slow++
        }
        fast++
    }
    fmt.Println(nums)
}