likes
comments
collection
share

【LeetCode】1089. 复写零

作者站长头像
站长
· 阅读数 19

【LeetCode】1089. 复写零

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    【LeetCode】1089. 复写零

  • 题目示例

    【LeetCode】1089. 复写零

  • 题目解析

    • 1 <= arr.length <= 10000
    • 0 <= arr[i] <= 9

二、思路分析:

我们读取本题,题目要求我们对一组整数数组arr中元素是0的进行就地复制,结果返回数组的arr原地址。在解答该题之前,我们需要对题目中一些细节点进行明确:

  • arr数组中元素是零,都要其位置后复制一个
  • 复制零的过程中不允许使用额外空间,在arr原地址上进行修改
  • 写入的元素之后,arr的长度不变

因此,在清楚题目要求后,我们刚开始读完题目,脑袋里立马想到使用栈来构建新的数组,但遗憾的是不符合题目要求。

  • 方法一:队列思想

    根据题目示例1展示,思考一番复写0的过程,主要有三个步骤:

    • 找到元素的零所在的位置
    • 在零元素后面添加一个新的元素
    • 保持arr长度,删除arr末尾的元素

    以上三个步骤与示例1结合,手动演示图如下:

    【LeetCode】1089. 复写零

    根据上述思想,我们使用Python代码能轻松实现,代码如下:

    class Solution(object):
        def duplicateZeros(self, arr):
            """
            :type arr: List[int]
            :rtype: None Do not return anything, modify arr in-place instead.
            """
            i = 0
            while i < len(arr):
                if arr[i] == 0:
                    arr.insert(i,0)
                    arr.pop()
                    i +=1
                i +=1
            return arr
    
    
  • 方法二:双指针

    • 定义两个指针i 和 top,第一轮遍历 top 指针记录arr中零的元素。当arr末尾为0是,top还需要移到两步。

    【LeetCode】1089. 复写零

    • 根据第一轮遍历的top和i位置,然后从右->左继续遍历一遍,当arr[i]==0时,则top需要往左再移动一步 【LeetCode】1089. 复写零

    根据以上双指针思路,python实现的代码如下:

    class Solution(object):
        def duplicateZeros(self, arr):
            """
            :type arr: List[int]
            :rtype: None Do not return anything, modify arr in-place instead.
            """
            top = 0
            i = -1
            n = len(arr)
    
            while top < n:
                i +=1 
                if arr[i] == 0:
                    top +=1
                top +=1
    
            if top > n:
                top = top -2
                arr[top] = 0
                top -=1
                i -=1
            else:
                top -=1
    
            while top >=0:
                arr[top] = arr[i]
                top -=1
                if arr[i] == 0:
                    arr[top] = 0
                    top -=1
                i -=1
            return arr
    

三、总结:

本题考察我们双指针思想,在数组中进行拷贝和移动,本次我们使用队列方法,AC提交记录如下:

【LeetCode】1089. 复写零

  • 时间复杂度O(n),n为arr长度
  • 空间复杂度O(1)

以上是本期内容,欢迎大佬们点赞评论,下期见~~~