0

我有一个数组int,大小为8. 我想要做的是搜索array对(例如,如果索引 0 上的数字与索引上的数字相同5)。

我尝试制作两个数组(第二个是第一个的副本),但这没有意义,因为一切都是成对的。

然后我尝试制作半数组,所以我制作了两个arrays大小4并比较它们。这并没有解决这些对可以在单个数组中。

为了填充array我使用随机数,随机数的最大值是array (8).

4

5 回答 5

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);
于 2013-03-09T11:46:01.777 回答
0

如果你有一个小的最大值,你可以初始化这个长度的位数组。遍历您的原始数组并为每个成员设置适当的位数组。如果这个位置的位数组为真,那么你有一对。如果您想要特定位置,请使用 int 数组。
尝试这样的事情:

BitArray bucket = new BitArray(<<your max value>>);
foreach(int i in originalArray)
{
if(bucket[i]) return true;
bucket[i] = true;
}
于 2013-03-09T11:45:46.543 回答
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

这是输出...

  • 方法一...
  • 方法 A 在 a 中找到对:1 和 1
  • 方法 A 在 a 中找到对:5 和 5
  • 方法 A 在 a 中找到对:5 和 5
  • 方法B...
  • 方法 B 在 b 中找到一对:1 和 1
  • 方法 B 在 b 中找到一对:5 和 5
  • 方法 B 在 b 中找到一对:5 和 5
  • 方法 B 在 b 中找到一对:5 和 5

我希望你能明白为什么方法 B 报告的对比方法 A 多。

于 2013-03-09T13:53:58.093 回答
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个元素,内容如下:

在此处输入图像描述

于 2013-03-09T11:57:32.513 回答
0

您可以创建一个字典(如dict[i]==>array of indices

var dubs = array.Select((i, inx) => new { i, inx })
            .GroupBy(x => x.i)
            .ToDictionary(g => g.Key, g => g.Select(y => y.inx).ToList());
于 2013-03-09T11:58:31.667 回答