面试之求两个数组的交集

求两个数组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
如果有其它什么更好的解决方法,欢迎留言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值