给定一个排序数组,就地删除重复项,使每个元素仅出现一次并返回新长度

问题描述 投票:0回答:5

完整的问题,我开始在线学习Python,但对这个标记为简单的问题有疑问

给定一个排序数组,就地删除重复项,使得每个 元素只出现一次并返回新的长度。不分配 另一个数组的额外空间,您必须通过修改输入来完成此操作 数组就位,具有 O(1) 额外内存。

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        k=0
        for i in range(i+1,len(nums)-1):
            j=i+1

            for j in range(j+1,len(len(nums))):
                if nums[i] == nums[j]:
                    del nums[j]
        len_list = nums
        return(len_list, nums)
python list
5个回答
21
投票

这相当容易,一旦您意识到必须从列表的end开始工作,这样您的删除就不会更改列表中您尚未检查的部分。

a = [1,1,1,3,4,5,5,5,5,7,7,7,9,9]
for i in range(len(a)-1,0,-1):
    if a[i] == a[i-1]:
        del a[i]

结果是

[1, 3, 4, 5, 7, 9]

1
投票

@BoarGules 的第一个答案是最好的。但我们也可以向前做。

a = [1,1,1,3,4,5,5,5,5,7,7,7,9,9]
i =0
l = len(a)-1
while i < l :
    if a[i] == a[i+1]:
        del a[i+1]
        l -=1
    else :
        i +=1    
print(a)

结果将是:

[1, 3, 4, 5, 7, 9]

0
投票

看起来您正在解决 LeetCode 问题: https://leetcode.com/problems/remove-duplicates-from-sorted-array/

如果是,这应该是你的答案:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if len(nums) == 1:
            return 1

        i = 0
        for j in range(1, len(nums)):
            if (nums[i] != nums[j]):
                i += 1
                nums[i] = nums[j]

        return i + 1

除了返回的长度之外,你留下的内容并不重要。


0
投票

下面的代码删除重复项并按降序对数组进行排序。

class Solution(object):
    def thirdMax(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        a_value=sorted(set(nums),reverse=True)
        if len(a_value) > 2:
           a=a_value[2]
        else:
           a=a_value[0]
        return a

0
投票

我认为我应该使用 Javascript 提供答案。

最好使用两指针技术来解决这个问题。定义将跟踪唯一元素的第一个指针和迭代数组 nums 的第二个指针。

function removeDuplicates(nums) {
    if (nums.length === 0) return 0;
    
    let uniqueIndex = 0;
    
    for(let i = 0; i < nums.length; i++) {
        if(nums[i] !== nums[uniqueIndex]) {
            uniqueIndex++
            nums[uniqueIndex] = nums[i];
        }
    }
    return uniqueIndex + 1;
    
};
  1. 首先,我们需要检查输入数组 nums 是否为空。

  2. 我们定义第一个指针

    let uniqueIndex = 0;
    来跟踪 独特的元素。

  3. 继续迭代我们的数组 nums。在 for 循环中, i 充当 第二个指针。它遍历数组,而 uniqueIndex 表示找到的最后一个唯一元素的当前位置。

条件

nums[i] !== nums[uniqueIndex]
检查当前是否 元素
(nums[i])
与最后找到的唯一元素不同
(nums[uniqueIndex])
。如果不同,则意味着新的独特元素 找到后,uniqueIndex指针递增,当前元素 被复制到uniqueIndex指示的位置。

© www.soinside.com 2019 - 2024. All rights reserved.