移动零

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

示例:

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

说明:

  • 必须在原数组上操作,不能拷贝额外的数组。
  • 尽量减少操作次数。

初步解答

一开始看到这个题目,首先想到的就是将 非0元素0 交换, 将元素前移。

代码如下:

In [1]:
class Solution:
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        zero_id = -1
        zero_repeated = 0
        for i in range(0, len(nums)):
            if zero_id >= 0:
                if nums[i] != 0:
                    nums[i], nums[zero_id] = nums[zero_id], nums[i]
                    zero_id = i - zero_repeated
                else:
                    zero_repeated += 1
            elif nums[i] == 0:
                zero_id = i

这里的思路是,记录了 需要交换的0值 下标,然后还记录了一个 重复出现的0值 次数,通过 i值 来确定下一个 需要交换的0值 下标。

但是这样子还是太复杂了。。而且写代码时候因为思路不够清晰,出了很多问题。

改正

参考了一下其他的人代码,发现我一开始的思路是对的,但是在实际编码中还是想的太复杂了。

题目本质是将 非0元素 提前,那么只要遇到 非0元素 就将其交换,然后交换下标前移一位。

这样最终遍历完成,也就得出了正确结果。

更正后的代码如下:

In [2]:
class Solution:
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        point = 0
        for i in range(len(nums)):
            if nums[i]:   
                nums[i], nums[point] = nums[point], nums[i]
                point += 1

这道题其实简单,但是我给钻入牛角尖了,实际上并没有那么复杂。。吸取教训。。

Comments !