您的位置:首页 > 编程语言

【恒生电子16年校招编程题】求两有序数组的交集并返回交集个数

2015-11-07 01:26 323 查看
上星期参加了恒生电子的笔试,来记录保存一下笔试编程题,以填充我枯竭的编程基础QAQ

题目大致意思:有两有序的数组aArray[] ,bArray[],已知他们的长度分别为aLength,bLength,求两数组的交集和交集个数

然后可以用C或者Java语言编程。

我选的C语言:
int Intersection(int aArray[], int bArray[], int aLength, int bLength, int result[])
【函数功能是题目给好的,不记得具体参数如何,大致是这样】

result[]存放交集数组。函数返回值为交集个数。

这是我童鞋思路:先将a数组与b数组逐个比较,如果a[i]大于等于b[j],若相等则存入result中,并a[i]与b[j+1]比较,若大于则直接a[i]与b[j+1]比较;如果a[i]小于b[j],则a[i+1]与b[j]比较;
**复杂度为(aLength*bLength)**。
int Intersection(int aArray[], int bArray[], int aLength, int bLength, int result[])
{
int aIndex,bIndex,i;
i=0;//result数组的个数
bIndex=0;
for(aIndex=0;aIndex<aLength;aIndex++)
{
for(;bIndex<bLength;bIndex++)
{
if(aArray[aIndex]>=bArray[bIndex])
{
//如果a[i]大于等于b[j],若相等则存入result中,并a[i]与b[j+1]比较
if(aArray[aIndex]==bArray[bIndex])
result[i++]=aArray[aIndex];
//若大于则直接a[i]与b[j+1]比较;
continue;
}
//如果a[i]小于b[j],则a[i+1]与b[j]比较;
if(aArray[aIndex]<bArray[bIndex])
{
break;
}
}
}
return i;//求交集个数
}


我的思路………:定义一动态数组total[],值为0,两个数组的值是这个动态数组的下标序号,遍历两个数组a[i],b[i],每次对应的total[i]的值+1。遍历完两个数组后寻找total[i]的值大于等于2的下标序号,这些数字也即两个数组的交集,然后把这些数字保存到result里面,同时求其个数。

复杂度为(aLength+bLength)

然而并没有什么用……我不记得动态数组怎么用了……

int Intersection(int aArray[], int bArray[], int aLength, int bLength, int result[])
{
int *total=0;//为动态数组赋值0
int num=1000;//设置动态数组有1000
int number=0;//number存放交集个数
// 动态数组需要申请内存块
total= (int *)malloc(sizeof(int)*num);
if (total == 0)             // 内存申请失败,退出
{
exit(0);
}

int i;
for(i=0;i<aLength;i++)
{
total[aArray[i]]+=1;
}
for(i=0;i<bLength;i++)
{
total[bArray[i]]+=1;
}
for(i=0;i<max(aArray[aLength-1],bArray[bLength-1]);i++)
{
if(total[i]>=2)result[number++]=i;
}
return number;
free(total);//最后别忘了释放内存空间
}


注意:这两个代码我都木有编译过,有错请在评论中指出,大家一起学习交流呗~

谢谢临幸我这个渣渣的日志~我会慢慢地向上努力~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: