一、前记(3/3)

最近这两天天气都有一点阴晴不定的,希望大家都好好地保重自己的身体,别感冒了。今天还有一个好消息:考研数学我已经完整的复习一遍了。下一个阶段应该就到了强化阶段,开始要每天疯狂地刷题。(要开始苦逼了😢)

二、题目描述

在这个题里面有几个要点要特别注意:第一个就是给定的列表类型的,但是输出要求的是数组;第二个就是本身题目的要求:要没有重复的数值。

三、解题思路

1、我的解题思路

(1)u1s1,我的解题思路不是题目的要求。题目的标签要求是:数组,双指针。但是我的想法就是,使用一个set(),去除列表内重复的数值。然后再放到nums数组里面。

参考代码如下所示:

class Solution(object):
    def removeDuplicates(self, nums) -> int:
        temp=list(set(nums))
        temp.sort()
        i=0
        for int1 in temp:
            nums[i]=int1
            i+=1
        return len(temp)

但是这个执行起来非常地快,但是占用的内存太多了

毕竟没有按照题目要求的双指针来写,所以接下来的这种方法是按照双指针来写的。

(2)首先将原本的列表里面的数值按照一定的顺序排列一遍,避免出现[1,1,2,1]这样的结果为3(其实正确的为2),然后检查第n个数值和第n+1个数值是否一致,如果不一致,那么指针记录,另一个指针继续挪动。

#encoding:utf-8
class Solution(object):
    def removeDuplicates(self, nums) -> int:
        i=0
        nums.sort()
        while i<len(nums)-1:
            if nums[i]==nums[i+1]:
                nums.remove(nums[i])
            else:
                i=i+1
        return len(nums)

#as a checking
solution=Solution()
a=[1,1,2,1]
print(solution.removeDuplicates(a))

虽然用到了双指针但是执行用时和内存消耗都是特别的大。

(2)别人的思路

在网上看了一圈,大家在指针问题上还有一个特别有意思的看法。我之前的想法是直接删除,但是网上有很多人使用了pop(出栈)指令,其实仔细想想这样的思路也是正确的。一开始的数据本来就是列表类型,碰见重复数据就pop(出栈),这样的做法本身也没有问题。

参考代码如下:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        try:
            for i in range(len(nums)):
                j = i + 1
                while nums[i] == nums[j]:
                    nums.pop(j)
        except:
            return len(nums)

四、学到了什么?

1、sort()

用做list下的排序

2、remove()

用做list下的删除

3、pop不必和append搭配使用