leetcode每日一练(从排序数组中删除重复项)

leetcode每日一练(从排序数组中删除重复项)


从今天开始,就开始我的leetcode刷题之旅,希望可以通过这样的训练,使得自己的算法水平提升

第一天

Question:(从排序数组中删除重复项)

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

Example:

给定数组 nums = [1,1,2], 

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 

你不需要考虑数组中超出新长度后面的元素。    

1. 思考

拿到这个问题时,我想了一下,咦,这题没啥难度呀,无非就是每个元素和后面的元素进行判断,如果相等的话,就删掉这个元素,于是我就开始写代码,我的代码如下

class Solution:
def removeDuplicates(self, nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    for i in range(len(nums)-1):
        if nums[i]==nums[i+1]:
            nums.remove(nums[i])

        return len(nums)

恩打眼一看,代码的确是和我想的一样,可是当我run这个代码时,出现了索引超出list的错误,我就在想,哪里出现了问题

2.问题总结

原来问题出现在,我在remove一个元素的时候,list长度已经发生了变化,而我们range所产生的的遍历数是之前生成,所以后面进行相等判断时,就会超出索引

那么知道问题的由来,怎么解决问题呢,就不要使用for语句,换成while语句

3.代码

改换以后的代码如下:

class Solution:
def removeDuplicates(self, nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    i=0
    while i<len(nums)-1:
        if nums[i]==nums[i+1]:
            nums.remove(nums[i])
        else:
            i+=1

    return len(nums)

再次运行,代码成功运行!

猜你喜欢

转载自blog.csdn.net/yixieling4397/article/details/80177384