Leetcode刷题记录(6):283移动零

刷题网站:Leetcode

难度: 简单

语言: Python

计划:从简单——>到中等——>再到难。

一、283移动零

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

  • 示例
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
  • 说明
  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

1.2 思考分析

初看题目还是挺简单的,唯一的要求是在原数组上操作,不能额外的数组。
所以,我看题目的初步想法是先对数组中所有的数一个一个和零进行比较,然后把不等于0的数放在前面,然后等于零的数看下有几个,相应的放在最后。

此时,我们需要有一个遍历,且需要比较数组与零是否相等,并把相应的非零数逐个放入前面。如下

k = 0
for i in range(len(nums)):
        if nums[i] != 0:
        	nums[k] = nums[i]
        	k+=1

但是还需要将所有的零放入后面,但是放几个零呢?这需要我们在for循环内判断有个几个零,即if之外的值,即上式改为

k=0
n=0
for i in range(len(nums)):
      if nums[i] != 0:
      	nums[k] = nums[i]
        k+=1
      else:
      	n+=1

此时n的值就是我们需要添加零的个数,然后将其从右到左的顺序逐个添加即可,所以完整代码如下:

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

最终的执行结果,击败了61.87%的用户,看来只能算及格了。
在这里插入图片描述
后来看了题解,解析为如下代码。虽然代码很短,但是执行结果还没我的好,可能我是直接在后面补零,而它的还需交换。

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        n = len(nums)
        left = right = 0
        while right < n:
            if nums[right] != 0:
                nums[left], nums[right] = nums[right], nums[left]
                left += 1
            right += 1

1.3 总结

本题是简单的判断、循环和补齐问题,比较好理解,没什么难度。

猜你喜欢

转载自blog.csdn.net/A33280000f/article/details/121197061