求两个数组int A[m]和int B[n]的交集。例如A={1,3,1,5,2,1},B={2,1,1,4},交集为{1,1,2}
面试问到这个问题第一反应是
(1)暴力遍历:
int* And(int A[],int m,int B[],int n)
{
vector<int> arr;
int flag = true;
for(int i=0;i<m;i++)
{
flag = true;
for(int j = 0;j<n;j++)
{
if(A[i] == B[j])
{
flag = false;
}
if(flag == false)
break;
}
if(flag == false)arr.push_back(A[i]);
}
int *tmp = (int*)malloc(sizeof(int)*arr.size());
for(int i = 0;i<arr.size();i++)
{
tmp[i] = arr[i];
}
return tmp;
}
(2)面试官问还有什么方法,第二反应是申请一个数组中数字最大的数组,数组里的数字对应数组中的下标,当数组的下标有的时候把下标中对应的数字加一;
int* And(int A[],int m,int B[],int n)
{
int max = max(A);
if(max<max(B))max = max(B);
int* flag = (int*)malloc(sizeof(int)*max);
memset(flag,0,sizeof(int)*max);
int count = 0;
for(int i = 0;i<m;i++)
{
flag[A[i]]++;
}
for(int i = 0;i<n;i++)
{
flag[B[i]++]++;
if(flag[B[i]]==2)count++;
}
int *tmp = (int*)malloc(sizeof(int)*count);
int k = 0;
for(int i=0;i<max;i++)
{
if(flag[i]==2)
{
tmp[k] =flag[i];
k++;
}
}
free(flag);
return tmp;
}
总结:以上两种做法都不太好,第二种做法取决于A,B数组的数字,如果数字过大且开辟的空间会很大。并且两种做法都无法解决并集中重复的问题(没有解决题目中的问题)。
查阅资料可知还有以下两种解决方式:
(3)使用map解决,但是也解决不了并集中重复问题。
(4)将A,B进行排序,由两个指针比较大小移动,可以解决重复问题,且是一个很好的方式。
https://www.cnblogs.com/u013533289/p/11676719.html
如果有其它什么更好的解决方法,欢迎留言。