日期:2014-05-19  浏览次数:20974 次

求任意数组的交集
有N个数组   N任意

求出这些数组中相同的共有的数字
例如
int[]   a1={1,2,3,4,5,6,7}
int[]   a2={2,3,4,5,6,7,9}
int[]   a3={2,3,4,5,6,8,9}
int[]   a4={1,2,4,5,6,8,9}

那么得出来的结果应该是
2,4,5,6

------解决方案--------------------
顶一下
------解决方案--------------------
int[] a1 ={ 1, 2, 3, 4, 5, 6, 7 };
int[] a2 ={ 2, 3, 4, 5, 6, 7, 9 };
int[] a3 ={ 2, 3, 4, 5, 6, 8, 9 };
int[] a4 ={ 1, 2, 4, 5, 6, 8, 9 };
foreach (int w in a1)
{
foreach (int x in a2)
{
foreach (int y in a3)
{
foreach (int z in a4)
{
if ((z == y) && (y == x) && (x == w))
{
Console.WriteLine(z);
}
}
}
}
}
Console.Read();
------解决方案--------------------
我觉的要只要证明第一个数组中的数据都在其他数组中存在即可
ArrayList al = new ArrayList();
foreach(int ivalue in a1)
{
bool bexist = false;
for(int i=1;i <N;i++)
{
int[] ary = GetArray(i);
if(ary.IndexOf(ivalue) > -1) bexist = true;
al.Add(ivalue);
}
}
return al;
------解决方案--------------------
先排序,然后取最短的数组循环,判断这个数组的元素在其它数组中是否存在(用哈希表可能快).
------解决方案--------------------
先扫描每个数组,去掉每个数组中重复的数
然后利用第一个数组的数据,建立一组哈希表的计数器,键用数据,值是计数器。用计数器去遍历个个数组,凡是数组里有的数据,计数器加一,
每扫描完一个,就看一下计数器,如果计数器的计数,小于已扫描的数组个数,那就放弃这个计数器。
最终剩下的计数器,就是共有的数据
------解决方案--------------------
int[] a1={1,2,3,4,5,6,7};
int[] a2={2,3,4,5,6,7,9};
int[] a3={2,3,4,5,6,8,9};
int[] a4={1,2,4,5,6,8,9};

List <int> l1 = new List <int> (a1);
List <int> l2 = new List <int> (a2);
List <int> l3 = new List <int> (a3);
string s = " ";
foreach (int i in a4)
{
if (l1.Contains(i) && l2.Contains(i) && l3.Contains(i))
{
s += i.ToString() + ', ';
}
}
Console.WriteLine(s.Substring(0,s.Length-1));
------解决方案--------------------
ding~~~