我们如何在重复两次以上的int数组中找到重复数字。我的一个例子如下:
public static void main()
{
int[] array = { 3, 7, 9 , 7, 4, 9, 7 , 9}
Dictionary<int,int> dic = new Dictionary<int,int>();
foreach(var Val in array)
{
if(dict.containskey(Val)
dic[Val] ++;
else
dic[Val] = 1 ;
}
foreach (var pair in dic)
if(key.value > 2 )
Console.WriteLine(pair.key)
}
有没有更好的方法呢?在一次采访中我被问到了。我给出了上述被拒绝的解决方案。
编辑::我被要求编写一个内存较少且性能良好的程序。它不应该使用linq或任何内置的C#扩展方法......
答案 0 :(得分:7)
对您的商品进行分组,只拍摄超过2次的商品:
array.GroupBy(x=>x).Where(x=>x.Count()>2).Select(x=>x.Key)
答案 1 :(得分:4)
由于没有为可以包含在此数组中的元素提供任何约束,您应该询问采访者是否需要具有O(n)时间复杂度和O(n)空间复杂度的解决方案* *或具有O(nlogn)时间复杂度和O(1)空间复杂度的解决方案**。
没有对数组中元素的约束,在O(n)时间复杂度和O(1)空间复杂度方面没有解决方案**。
因为他拒绝你的解决方案(这是O(n)时间复杂度和O(n)空间复杂度**)显然他正在寻找第二个。实现这一目标的一种方法是首先对数组进行排序,然后对其进行迭代以找到重复数据。
备注**:为空间复杂度提供的示例值不包括原始数组占用的空间,只包含所需的额外空间。
答案 2 :(得分:0)
试试这个:
Int[] array = { 3, 7, 9 , 7, 4, 9, 7 , 9};
string duplicates="";
for(int i=0;i<array.length;i++)
{
for (int j=i+1;j<array.length;j++)
{
if(array[i]==array[j])
{
duplicates+=Convert.tostring(array[i]) + ",";
}
}
}
答案 3 :(得分:0)
最快的解决方案是对数组进行排序,然后计算排序数组中相等的后续数字。这种方法的复杂性是O(N log N),其中N是数组中的数字的计数。为此,您可以使用List<int>
类型。它包含所需的排序方法。
答案 4 :(得分:0)
我建议您执行以下操作:
Max
值。Frequent Array
的{{1}}。循环投放数组并根据数组值更新Maxvalue + 1
。
Frequent Array
复杂性将是&gt;&gt;&gt; O(N logN + Maxvalue)
答案 5 :(得分:0)
static void printRepeating(int [] arr, 整数大小) { 我
Console.Write("The repeating" +
" elements are : ");
for (i = 0; i < size; i++)
{
if (arr[ Math.Abs(arr[i])] >= 0)
arr[ Math.Abs(arr[i])] =
-arr[ Math.Abs(arr[i])];
else
Console.Write(Math.Abs(arr[i]) + " ");
}
} **strong text**