3 回答
TA贡献1853条经验 获得超9个赞
第一个问题涉及第一个陈述。
int[,] secArray = new int[n,2];
在遍历数组之前,您不知道数组中有多少个唯一元素。您不能使用n,因为n是参数的总数,可以大于唯一元素的数量。
其次,嵌套的for循环效率很低。您的算法会遍历数组中每个元素的数组,因此它将在O(n ^ 2)时间内运行。
想想:您是否必须多次遍历数组?为什么不使用哈希表(C#中的字典)在遍历数组时跟踪计数?哈希表使用一种非常有效的查找机制来告诉您是否已经看到该元素,并且该值可用于跟踪计数。
考虑用以下代码替换有问题的代码,并了解其工作方式。
Dictionary<int, int> elementCounts = new Dictionary<int, int>();
for(int i = 0; i < n; i++)
{
int element = array[i];
if (elementCounts.ContainsKey(element))
elementCounts[element]++;
else
elementCounts.Add(element, 1);
}
Console.WriteLine("How many same elements?");
foreach(KeyValuePair<int,int> count in elementCounts)
{
Console.WriteLine("Element: {0} Count: {1}", count.Key, count.Value);
}
然后,如果要将哈希表(Dictionary)中的结果复制到二维数组,则可以执行以下操作。
int numberOfUniqueElements = elementCounts.Count;
int[,] secArray = new int[numberOfUniqueElements, 2];
int j = 0;
foreach (KeyValuePair<int, int> count in elementCounts)
{
secArray[j, 0] = count.Key;
secArray[j, 1] = count.Value;
j++;
}
TA贡献1966条经验 获得超4个赞
我会用Linq的GroupBy来做到这一点
var array = new int[] { 2, 1, 2, 2, 5 }; var result = array.GroupBy(x => x).Select(x => new[] { x.Key, x.Count() }).ToArray();
TA贡献1811条经验 获得超5个赞
为什么不使用哈希表。令数组中的数字为哈希条目键,令哈希条目的值为计数。然后只需遍历数组一次。在遍历数组时,检查是否存在哈希条目(如果存在),如果没有,则添加1。
就像是
for(int i = 0; i<n;i++) {
if(hashTable.containsKey(array[i])) {
hashTable[array[i]]++];
} else {
hashTable.add(array[i],1);
}
}
请注意,这是quedocode,将需要查找方法并正确实现。
- 3 回答
- 0 关注
- 160 浏览
添加回答
举报