3 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊
第一個(gè)問題涉及第一個(gè)陳述。
int[,] secArray = new int[n,2];
在遍歷數(shù)組之前,您不知道數(shù)組中有多少個(gè)唯一元素。您不能使用n,因?yàn)閚是參數(shù)的總數(shù),可以大于唯一元素的數(shù)量。
其次,嵌套的for循環(huán)效率很低。您的算法會(huì)遍歷數(shù)組中每個(gè)元素的數(shù)組,因此它將在O(n ^ 2)時(shí)間內(nèi)運(yùn)行。
想想:您是否必須多次遍歷數(shù)組?為什么不使用哈希表(C#中的字典)在遍歷數(shù)組時(shí)跟蹤計(jì)數(shù)?哈希表使用一種非常有效的查找機(jī)制來告訴您是否已經(jīng)看到該元素,并且該值可用于跟蹤計(jì)數(shù)。
考慮用以下代碼替換有問題的代碼,并了解其工作方式。
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)中的結(jié)果復(fù)制到二維數(shù)組,則可以執(zhí)行以下操作。
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貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊
我會(huì)用Linq的GroupBy來做到這一點(diǎn)
var array = new int[] { 2, 1, 2, 2, 5 }; var result = array.GroupBy(x => x).Select(x => new[] { x.Key, x.Count() }).ToArray();

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
為什么不使用哈希表。令數(shù)組中的數(shù)字為哈希條目鍵,令哈希條目的值為計(jì)數(shù)。然后只需遍歷數(shù)組一次。在遍歷數(shù)組時(shí),檢查是否存在哈希條目(如果存在),如果沒有,則添加1。
就像是
for(int i = 0; i<n;i++) {
if(hashTable.containsKey(array[i])) {
hashTable[array[i]]++];
} else {
hashTable.add(array[i],1);
}
}
請(qǐng)注意,這是quedocode,將需要查找方法并正確實(shí)現(xiàn)。
- 3 回答
- 0 關(guān)注
- 194 瀏覽
添加回答
舉報(bào)