我有一个int
数组,大小为8
。我想要做的是在array
中搜索对(例如,如果索引0上的数字与索引5
上的数字相同)。
我尝试制作两个数组(第二个是第一个副本),但这没有意义,因为所有内容都是成对的。
然后我尝试制作半数组,因此我制作了两个arrays
大小4
并进行比较。这并没有解决对可以是单个数组。
要填充array
我使用的是随机数,随机数的最大值是array
(8)
的大小。
答案 0 :(得分:1)
您可以使用LINQ。
int[] array = new[] { 1, 2, 3, 1, 4, 5, 6, 7, 8, 8 };
var duplicates = array
.GroupBy(i => i)
.Where(g => g.Count() > 1)
.Select(g => g.Key);
foreach (var d in duplicates)
Console.WriteLine(d);
答案 1 :(得分:0)
如果您的最大值较小,则可以初始化此长度的位数组。浏览原始数组并为每个成员设置适当的位数组。如果此位置的位数组为真,那么您有一对。如果需要特定位置,请使用int数组 尝试这样的事情:
BitArray bucket = new BitArray(<<your max value>>);
foreach(int i in originalArray)
{
if(bucket[i]) return true;
bucket[i] = true;
}
答案 2 :(得分:0)
如果您不仅要获取重复的值列表,还要获取发生该值的索引,则可以使用该LINQ to Objects查询:
int[] items = new[] { 1, 2, 3, 1, 4, 5, 3, 7 };
var duplicates = items.Select((e, i) => new { e, i })
.GroupBy(i => i.e)
.Where(g => g.Count() > 1)
.Select(g => new { Value = g.Key, Indexes = g.Select(e => e.i).ToList() })
.ToList();
duplicates
包含2个元素,内容如下:
答案 3 :(得分:0)
您可以创建字典(例如 dict [i] ==&gt;索引数组)
var dubs = array.Select((i, inx) => new { i, inx })
.GroupBy(x => x.i)
.ToDictionary(g => g.Key, g => g.Select(y => y.inx).ToList());
答案 4 :(得分:0)
查找对的传统方法是对数组进行排序(下面的方法A)。另一种方法是有两个嵌套循环(方法B)。
Tell("Method A...");
int[] a = new int[]{3, 1, 4, 1, 5, 9, 5, 5};
int lengthA = a.Length;
Array.Sort(a);
for (int i = 1; i < lengthA; i++)
{
if (a[i-1] == a[i])
{
Tell("Method A Found pair in a: "+a[i-1]+" and "+a[i]);
}
} // for i
Tell("Method B...");
int[] b = new int[]{3, 1, 4, 1, 5, 9, 5, 5};
int lengthB = b.Length;
for (int i = 0; i < lengthB-1; i++)
{
for (int j = i+1; j < lengthB; j++)
{
if (b[i] == b[j])
{
Tell("Method B Found a pair in b: "+b[i]+" and "+b[j]);
}
} // for j
} // for i
这是输出......
我希望你能看出为什么方法B会报告比方法A更多的对。