从数组中删除重复项

时间:2010-01-13 09:41:00

标签: c# arrays algorithm data-structures

我需要从数组中删除重复的条目,但不能使用任何新的数据结构,同一个数组应该只返回不同的元素。例如,如果我的数组是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);
}

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

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

总复杂度为O(N * logN),优于您提出的N ^ 2.

如果您必须保留初始订购,那么我还没准备好提出解决方案。

答案 2 :(得分:1)

上次我检查C#允许你对2个数组进行排序,使用一个数组进行比较并对两者进行交换。

以下是您可以做的事情:

  • 创建一个存储数字0到N-1的数组indices
  • 使用array作为关键字排序indicesarray
  • 找到重复项并将重复项的索引设置为N + 1。
  • 使用array作为关键字排序indicesindices
  • 将数组调整为正确的大小并预先设置。

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