如何在不重新排列数组元素的情况下计算数组中的唯一数字?

时间:2009-03-05 05:30:45

标签: c# arrays algorithm

我无法计算数组中的唯一值,我需要这样做而不需要重新排列数组元素。

我该如何做到这一点?

4 个答案:

答案 0 :(得分:16)

如果你有.NET 3.5,你可以通过LINQ轻松实现这一点:

int numberOfElements = myArray.Distinct().Count();

非LINQ:

List<int> uniqueValues = new List<int>();
for(int i = 0; i < myArray.Length; ++i)
{
    if(!uniqueValues.Contains(myArray[i]))
        uniqueValues.Add(myArray[i]);
}
int numberOfElements = uniqueValues.Count;

答案 1 :(得分:6)

这是一种效率更高的非LINQ实现。

        var array = new int[] { 1, 2, 3, 3, 3, 4 };
        // .Net 3.0 - use Dictionary<int, bool> 
        // .Net 1.1 - use Hashtable 
        var set = new HashSet<int>();
        foreach (var item in array) {
            if (!set.Contains(item)) set.Add(item);
        }
        Console.WriteLine("There are {0} distinct values. ", set.Count);

答案 2 :(得分:1)

O(n)运行时间max_value内存使用量

boolean[] data = new boolean[maxValue];
for (int n : list) {
   if (data[n]) counter++
   else data[n] = true;
}

答案 3 :(得分:0)

是否应仅计算不同的值,还是应计算数组中的每个数字(例如“5号包含3次”)?

第二个要求可以通过计数排序算法的启动步骤来实现 它会是这样的:

  • 构建索引/键所在的集合 要计算的要素
  • 一个键连接到一个保存出现次数的变量 关键要素
  • 迭代数组
    • key的增量值(array [index])

此致