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

1 篇文章 0 订阅
1 篇文章 0 订阅

上星期参加了恒生电子的笔试,来记录保存一下笔试编程题,以填充我枯竭的编程基础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);//最后别忘了释放内存空间
}

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

谢谢临幸我这个渣渣的日志~我会慢慢地向上努力~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值