【发布时间】:2009-03-05 05:30:44
【问题描述】:
我无法计算数组中的唯一值,我需要这样做而不重新排列数组元素。
我怎样才能做到这一点?
【问题讨论】:
-
家庭作业没有错...只要一个人不只是按原样接受答案。 (即,接受答案,并使其更好)。
我无法计算数组中的唯一值,我需要这样做而不重新排列数组元素。
我怎样才能做到这一点?
【问题讨论】:
如果你有 .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;
【讨论】:
这是一种效率更高的非 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);
【讨论】:
O(n) 运行时间 max_value 内存使用量
boolean[] data = new boolean[maxValue];
for (int n : list) {
if (data[n]) counter++
else data[n] = true;
}
【讨论】:
应该只计算不同的值还是应该计算数组中的每个数字(例如“数字 5 包含 3 次”)?
第二个要求可以通过计数排序算法的起始步骤来满足。
应该是这样的:
问候
【讨论】: