Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
从上述题目要求中,我们可以提取出如下几点信息:
- 不能改变数组的长度: 意味着不能使用remove、pop方法删除元素
- 不能使用额外空间:潜台词不能借助新建tmp等临时数组变量
- 输入的数组是升序排列的
二、思路分析:
从题目的要求得出,我们需要在原数组中完成删除的重复项,那么最直接的方法就是使用双指针
-
什么是双指针?
双指针,顾名思义是使用两个指针,遍历列表进行取值计算。
通常双指针位置有三个场景:
场景一:双指针同一个起点开开始
场景二:双指针错位开始
场景三:双指针一头一尾
按照本题的要求,我们可以使用双指针在列表取值遍历。
- 在python中,我们直接定义两个变量fast和slow。
- 考虑到列表越界,fast和slow为1
- 当 List[fast] 与 List[fast-1]两个值相等时,fast➕1
- 当 List[fast] 与 List[fast-1] 不相等时,List[slow] 被赋值成 List[fast],且slow+1,fast+1
我们以List=[1,2,3,3,3,4] 这个列表来为示例,画图顺序为如下过程:
-
初始化列表
-
第一次比较,1与2不相等,slow和fast都➕1
-
第二次比较,2与3也不相等,则List[slow] 被List[fast]赋值, slow与fast都➕1
-
第三次比较,3与3相等,则只需要fast+1
-
第四次比较,3与4不相等,则List[slow]=3 被List[fast]=4 赋值,slow与fast都➕1
-
第五次比较,fast+1 大于列表长度,则遍历结束
三、实现代码:
根据上述,画图推理思路,我们用代码进行实现,如下:
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
fast=slow = 1
while fast < len(nums):
if nums[fast] != nums[fast-1]:
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow
四、总结:
本次题主要考察的是使用双指针对列表中的元素进行删除处理,这样的用法使用可以达到时间复杂度O(n)和空间复杂度O(1)的题目要求。