leetcode每日刷题:1089. 复写零

给你一个长度固定的整数数组 arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过该数组长度的位置写入元素。

要求:请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

输入:[1,0,2,3,0,4,5,0]
输出:null
解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]

 

输入:[1,2,3]
输出:null
解释:调用函数后,输入的数组将被修改为:[1,2,3]

代码:

暴力解法:按照题目要求,使用一个while循环对列表进行遍历

小技巧:这里的下标从1开始,从前一位判断是否等于0,更方便去写逻辑,同时不用担心i会越界的问题

当前一位等于0的时候,指针i会向后移两位,因为你在0后面补充了一个0,所以才会移动两位

class Solution:
    def duplicateZeros(self, arr: List[int]) -> None:
        if 0 not in arr:
            return None
        
        i=1
        N = len(arr)
        while i < N:
            if arr[i-1] ==0:
                arr[i+1:N]=arr[i:N-1]
                arr[i]=0
                i+=2
            else:
                i+=1

使用python自带的函数(不必重复遭车轮,会用就行):

思路是使用list自带的insert函数,遍历整个列表,当遇到0的时候,就在后面补充一个0,然后使用pop函数,删除最后一个元素

可能会有这样的疑问,这里为什么是i+=1,注意,下面的i+=1区别于第一种思路,没有写在else里面,也就是说无论如何都会后移一次,当前为0的时候,if里面移动一次,外面又移动一次,所以是两次,其实和上面的写法一样。

(推荐上面一种if-else的写法,好理解一些,下面的虽然简洁,但是需要时间思考一下,不是很直观)

class Solution:
    def duplicateZeros(self, arr: List[int]) -> None:
        i=0
        while i <len(arr):
            if arr[i]==0:
                arr.insert(i+1,0)
                arr.pop()
                i+=1
            i+=1

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值