当前位置: 首页 > 知识库问答 >
问题:

使用HashSet从排序数组中删除重复项

艾宁
2023-03-14

我有一个问题:

对象显示给定一个排序数组,删除重复的元素,使每个元素只出现一次,并返回新的长度。不要为另一个数组分配额外的空间,必须在内存不变的情况下这样做。例如,给定输入数组Nums=[1,1,2],你的函数应该返回长度=2,Nums的前两个元素分别为1和2。你在新的长度之外留下什么并不重要。

我使用HashSet来回答这个问题,但结果总是显示[1,1]。我想不出来有人能帮我知道问题出在哪里吗?

我的代码:

class Solution {
    public int removeDuplicates(int[] nums) {
        if (nums.length == 0) return 0;
        Set<Integer> numset = new HashSet<>();
        for(int i:nums){
            numset.add(i);
        }
        return numset.size();
    }
}

您的输入[1,1,2]您的答案[1,1]预期答案[1,2]

共有3个答案

宇文俊明
2023-03-14

使用额外的数据结构也违反了您提到的规则,即不为其分配额外空间。现在,由于数组已经排序,下面的代码可以正常工作。

int solution(int[] nums) {
    int size = nums.length;
    if (size == 0 || size == 1) {
        return size;
    }
    int next = 0;

    for (int i = 0; i < size - 1; i++) {
        if (nums[i] != nums[i + 1]) {
            nums[next++] = nums[i];
        }
    }
    nums[next++] = nums[size - 1];

    return next;
}

在上面的代码中,我们只是维护了一个额外的索引(next),以便只跟踪唯一的元素,并通过覆盖非唯一的元素将它们移动到前面。

羊越
2023-03-14
  • 您的解决方案不是就地解决方案
  • 由于使用的是散列集,因此违反了常量内存规则
  • 在java中,一旦数组被初始化,我们就不能缩小它的大小

因此,对于最坏情况时间复杂度为O(n)的问题,这里有一个简单的就地解决方案。

public int removeDuplicates(int[] nums){

    int length = nums.length;
    int index = 0;

    for(int i = 0; i < length - 1; i++){
        if(nums[i] == nums[i+1]){
            nums[index++] = nums[i];
        }
    }
    // this is needed because upper for loop runs until i equals to length-2
    // in order to avoid ArrayOutOfBoundException 
    nums[index++] = nums[length-1];

    // for displaying the unique array
    /*
    for(int i = 0; i < index; i++){
        System.out.println(nums[i]);
    }
    */

    return index;
}
蒋高杰
2023-03-14

假设你有一个排序数组:

int[] nums = { 1, 2, 2, 2, 4, 5, 5, 5, 7, 7, 8 };

... walk through nums, at some read position check for being a duplicate,
... (otherwise) write it compact at the write position
... return new length

覆盖nums。

因为我不想破坏编码的任何满足感,请便...

策略:在纸上解决问题。

 类似资料:
  • 问题内容: 我使用下面的代码行遍历数据库中的一个表: 如果我打印出数组: 我会得到这个: 但是我想摆脱数组中的重复项,所以我使用 我得到下面的奇怪结果,这不是我想要的结果: 理想情况下,我认为它应该返回以下内容: 我该怎么做才能正确处理?我使用了错误的PHP语法/默认功能吗? 问题答案: 该功能将为您完成此操作。您只需要添加标志:

  • 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1,2。 你不需要考虑数组中超出新长度后面的元素。 示例 2: 给定 nu

  • 问题内容: 我有一个未排序的整数数组,其值的范围从Integer.MIN_VALUE到Integer.MAX_VALUE。数组中可以有任意整数的多个重复项。我需要返回一个删除了所有重复项的数组,并且还需要保持元素的顺序。 例: 输出应为{7,8,1,9,0,2} 我知道可以使用解决此问题,但我需要一个不占用大量缓冲区空间的解决方案。 问题答案: 您可以使用Java 8 Arrays 方法从数组中获

  • 问题内容: 我应该读一个包含许多不同电子邮件地址的文件,并使用数组将它们打印出来。问题是我需要消除重复的电子邮件。 我能够尝试/捕捉并打印出电子邮件地址。但是,我不确定如何删除重复项。我对散列码或如何使用Set尚不了解。任何援助将不胜感激。 这是我到目前为止的内容: 问题答案: 简单的解决方案是使用Set Java, 因此设置自动删除重复值 并且在你的代码中你拥有数组,而不是将转换数组直接使用代码

  • 这是我的数据: 使用Lodash,我如何删除具有重复id键的对象?有过滤器,地图和独特的东西,但不太确定。 我的真实数据集要大得多,有更多的键,但概念应该是一样的。

  • 我有一个问题编码这个: 编写一个名为的静态方法,该方法将整数数组作为输入,并返回一个新的整数数组,其中所有重复项都被删除。例如,如果输入数组具有元素{4,3,3,4,5,2,4},则结果数组应为{4,3,5,2} 这是我目前所做的