【问题标题】:Delete Duplicate from an Array从数组中删除重复项
【发布时间】:2011-01-04 13:38:35
【问题描述】:

我需要从数组中删除重复的条目,但不能使用任何新的数据结构,并且同一个数组应该只返回不同的元素。例如,如果我的数组是1,3,3,3,5,55,67,1,那么结果应该是1,3,5,55,67

我相信我已经解决了这个问题,但我需要你对它是否是一个好的算法或者我是否需要改变一些东西提出意见。

public void DeleteDuplicate(int[] array)
{
    int l = 0;
    int newPosition = array.Length -1;
    for (int i = 0; i < array.Length; i++)
    {
        for (int j = i + 1; j < array.Length-l; j++)
        {
            if (array[i] == array[j])
            {
                int temp = array[j];
                array[j] = array[newPosition];
                array[newPosition] = temp;
                newPosition--;
                l++;
            }
        }
    }
    Array.Resize(ref array, array.Length - l);
}

【问题讨论】:

  • 是否允许以其他方式改变数组(例如重新排序元素)?从您的示例中不清楚。如果答案是肯定的,那么你可以做得更快。

标签: c# arrays algorithm data-structures


【解决方案1】:

您的代码有问题。尝试针对 {1, 1, 1} 运行它 - 我认为它会返回 {1, 1}。

【讨论】:

    【解决方案2】:

    一般来说,问题是你是否必须保持元素的相对顺序。例如,输入 {2, 1, 2, 1} 是否可以返回 {1, 2}。

    如果允许,那么最快的解决方案是:

    • 排序输入数组
    • 运行一次,比较 a[i] 和 a[i+1] 并删除 O(N)' 中的重复项

    总复杂度为 O(N*logN),比你建议的 N^2 好。

    如果您必须保留初始顺序,那么我不准备提出解决方案。

    【讨论】:

    • 请告诉我如何删除重复的元素。由于我使用了 Array.Resize,在这种情况下,当我将 i 与 i+1 进行比较时,如果找到匹配项,则我需要将 i+1 移动到数组的末尾。在这种情况下,这将不起作用。假设数组内容 1 1 1 3 3 5..然后在第一步 1 1 3 3 5 1--从最后一个删除 1--现在数组是 1 1 3 3 5。现在 1 将与 3 和第二个进行比较1 不会被删除。请帮忙
    • 这绝对是可能的。您只是不立即交换元素-首先遍历数组,用零或数组中不存在的其他数字替换所有重复项,然后仅在最后将所有元素移动到它们各自的位置 1 pass through数组。
    【解决方案3】:

    上次我检查 C# 时允许您通过使用一个进行比较并对两个数组进行交换来对 2 个数组进行排序。

    您可以这样做:

    • 创建一个数组indices 来存储数字0 到N-1。
    • 使用array 作为键对arrayindices 进行排序。
    • 查找重复项并将重复项的索引设置为 N+1。
    • 使用indices 作为键对arrayindices 进行排序。
    • 将数组大小调整为正确大小并立即调整。

    这会删除重复项并保留顺序。

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 2013-08-03
      • 2017-11-06
      • 2019-03-15
      • 2012-04-20
      相关资源
      最近更新 更多