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 总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值