【LeetCode】1089. 复写零
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
1 <= arr.length <= 10000
0 <= arr[i] <= 9
二、思路分析:
我们读取本题,题目要求我们对一组整数数组arr中元素是0的进行就地复制,结果返回数组的arr原地址。在解答该题之前,我们需要对题目中一些细节点进行明确:
- arr数组中元素是零,都要其位置后复制一个
- 复制零的过程中不允许使用额外空间,在arr原地址上进行修改
- 写入的元素之后,arr的长度不变
因此,在清楚题目要求后,我们刚开始读完题目,脑袋里立马想到使用栈来构建新的数组,但遗憾的是不符合题目要求。
-
方法一:队列思想
根据题目示例1展示,思考一番复写0的过程,主要有三个步骤:
- 找到元素的零所在的位置
- 在零元素后面添加一个新的元素
- 保持arr长度,删除arr末尾的元素
以上三个步骤与示例1结合,手动演示图如下:
根据上述思想,我们使用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还需要移到两步。
- 根据第一轮遍历的top和i位置,然后从右->左继续遍历一遍,当arr[i]==0时,则top需要往左再移动一步
根据以上双指针思路,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提交记录如下:
- 时间复杂度O(n),n为arr长度
- 空间复杂度O(1)
以上是本期内容,欢迎大佬们点赞评论,下期见~~~
转载自:https://juejin.cn/post/7110219438334410788