LeetCode 热题 100 之 283. 移动零

题目描述

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

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:

输入: nums = [0]
输出: [0]

提示:

1 <= nums.length <= 104
-2^31 <= nums[i] <= 2^31 - 1

进阶:你能尽量减少完成的操作次数吗?

简单思路

使用双指针l,r。l为左到右第一个为0的下标,r为l右第一个不为0的下标。交换位置即可

代码

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        l = 0
        r = 0
        while(r<len(nums) and l <len(nums)):
            while(l <len(nums) and nums[l]!=0):
                # 找到为0的数的位置
                l+=1
            while(r<len(nums) and nums[r]==0):
                # 找到l位置后不为0的数位置
                r+=1
            if(l > r):
                r = l+1
            elif(r < len(nums)):
                temp = nums[r]
                nums[r] = nums[l]
                nums[l] = temp
                l = l + 1
                r = r+1

进阶思路

快慢指针实现,快慢指针均从数组开始往后走,快指针每次走一步,判断是否当然位置是0,不是时,把快指针的指向的值复制到慢指针所在位置,并且慢指针往后走一步.当快指针走完时,将慢指针后的所有值赋值为0.

代码

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        slow = 0
        for fast in range(len(nums)):
            if nums[fast] != 0:
                nums[slow] = nums[fast]
                slow += 1
        for i in range(slow, len(nums)):
            nums[i] = 0


posted @   anamazingclown  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示