我试图找到两个int数组的交集。我正在使用此代码:
public int[] Find_Common_Elements(int[] p1, int[] p2)
{
int count = 0;
for (int i = 0; i < p1.Length; i++)
{
for (int j = 0; j < p2.Length; j++)
{
if (p1[i] == p2[j])
{
count++;
break;
}
}
}
int[] result = new int[count];
count = 0;
for (int i = 0; i < p1.Length; i++)
{
for (int j = 0; j < p2.Length; j++)
{
if (p1[i] == p2[j])
{
result[count++] = p1[i];
break;
}
}
}
return result;
}
public int[] BubbleSort(int[] numarray)
{
int max = numarray.Length;
for (int i = 1; i < max; i++)
{
for (int j = 0; j < max - i; j++)
{
if (numarray[j] > numarray[j + 1])
{
int temp = numarray[j];
numarray[j] = numarray[j + 1];
numarray[j + 1] = temp;
}
}
}
return numarray;
}
public int[] Find_Unique_Elements(int[] numarray)
{
BubbleSort(numarray);
int element = numarray[0];
int count = 1;
for (int i = 1; i < numarray.Length; i++)
{
if (element == numarray[i])
continue;
else
{
element = numarray[i];
count++;
}
}
int[] result = new int[count];
count = 0;
element = numarray[0];
result[count++] = element;
for (int i = 1; i < numarray.Length; i++)
{
if (element == numarray[i])
continue;
else
{
element = numarray[i];
result[count++] = element;
}
}
return result;
}
public void Result()
{
int[] array1 = new int[] { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
95, 85, 75, 65, 55, 45, 35, 25, 15, 05,
10, 15, 20, 25, 30, 35, 40, 45, 50, 55
};
int[] array2 = new int[] { 15, 25, 35, 45, 55,
12, 22, 32, 43, 52,
15, 25, 35, 45, 55
};
int[] p1 = Find_Unique_Elements(array1);
int[] p2 = Find_Unique_Elements(array2);
int[] result = Find_Common_Elements(array1, array2);
for (int i = 0; i < p1.Length; i++)
textBox1.Text += "\n" + p1[i].ToString();
for (int i = 0; i < p2.Length; i++)
textBox2.Text += "\n" + p2[i].ToString();
for (int i = 0; i < result.Length; i++)
textBox3.Text += "\n"+result[i].ToString();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
Result();
}
但问题是,获得的结果是15 15 25 25 35 35 45 45 55 55,我想要15 25 35 45 55.这段代码有什么问题? 谢谢你的帮助
答案 0 :(得分:14)
您可以使用内置的Linq Intersect
扩展方法:
using System.Linq; // Make sure you include this line
public int[] Find_Common_Elements(int[] p1, int[] p2)
{
return p1.Intersect(p2).ToArray();
}
答案 1 :(得分:3)
如果你想在学术上解决问题,即不使用内置方法,那么这里有两个解决方案:
对两个数组进行排序。然后通过它们进行传递,类似于Merge sort并打印出相同的元素。
在一个数组中查找一个数据透视表(例如,使用Median of Medians算法)。然后围绕该枢轴划分每个阵列。然后打印出两个数组中共同的枢轴值(通过这样做,你已经解决了枢轴元素的交叉点)。然后以递归方式重复左侧分区和两个阵列右侧分区上的操作。
答案 2 :(得分:1)
Linq绝对是最干净的方法,但这并不意味着你应该抛弃你的代码。这是一个很好的学习工具来质疑“为什么这段代码不能做同样的事情?”
答案非常简单。您没有将唯一数组传递到Find_Common_Elements
! (Find_Common_Elements
有一个内置的假设,即输入具有唯一元素,否则行为将如预期的那样。)只需更改此
int[] result = Find_Common_Elements(array1, array2);
到此:
int[] result = Find_Common_Elements(p1, p2);
会让您的代码完美运行。
答案 3 :(得分:0)
static void Main(string[] args)
{
int[] one= { 1, 3, 4, 6, 7 };
int[] second = { 1, 2, 4, 5 };
foreach (int r in one.Intersect(second))
Console.WriteLine(r);
Console.ReadLine();
}
享受