LeetCode: 283. 移动零

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

示例:

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

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

方法一:

先找出不是0的数放入原数组,用一个指针记录更改数组后最后一个非0的下标,再用一个for循环将数组剩余的部分用0填充即可。

Python版:

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        index = 0
        for num in nums:
            if num != 0:
                nums[index] = num
                index += 1
        while index < len(nums):
            nums[index] = 0
            index += 1

Java版:

class Solution {
    public void moveZeroes(int[] nums) {
        int j = 0;
        for(int i= 0; i < nums.length; i++) {
            if (nums[i] != 0 ) nums[j++] = nums[i];
        }
        for(int i=j; i < nums.length; i++) {
            nums[i] = 0;
        }
    }
}

方法二:

快慢指针法:初始slow、fast 指针都指向下标0;开始移动fast指针,当fast指针不等于0是,左右指针对应元素互换; 初始化slow = 0,然后开始循环数组,遇到非0的数字,赋值给slow,slow 加1

循环slow走到len(nums) - 1,将剩余的index都替换成0.

Python版:

def moveZeroes(self, nums: List[int]) -> None:
    """
        Do not return anything, modify nums in-place instead.
        """
    slow = fast = 0
    while fast < len(nums):
        if nums[fast] != 0:
                nums[slow], nums[fast] = nums[fast], nums[slow]
            slow += 1
        fast += 1

Java版:

public void moveZeroes(int[] nums) {
    int slow = 0, fast = 0;
    while (fast < nums.length) {
        if (nums[fast] != 0) {
            int tmp = nums[fast];
            nums[fast] = nums[slow];
            nums[slow] = tmp;
            low++;
        }
        fast++;
    }
}

参考资料:

283. 移动零 - 力扣(LeetCode) (leetcode-cn.com)

283. 移动零 题解 - 力扣(LeetCode) (leetcode-cn.com)

posted @ 2021-07-19 22:14  呆叔编程567  阅读(45)  评论(0编辑  收藏  举报