阿里巴巴笔试题1.4

题目四:

http://topic.csdn.net/u/20081012/14/3CC93688-1F7F-4985-806C-3F729C78261B.html

 

有两个有序整数集合ab,写一个函数找出它们的交集?

 

Answer1:

第二题,时间复杂度O(n1+n2);

int[] a = {2, 3, 4, 4, 4, 4, 7, 8, 8, 8, 8, 9, 100, 130, 150, 160};

    int[] b = {4, 4,6, 7, 7, 7, 7, 8, 8, 9, 10, 100, 130, 130, 140, 150};

        int i=0,j=0;

        ArrayList al=new ArrayList();

        while(i <a.length&&(j <b.length)){

        if(a[i] <b[j])

        i++;

        else if(a[i]>b[j])

        j++;

        else{

        i++;j++;

        al.add(a[i]);

        }

        }

 

题目五:

http://topic.csdn.net/u/20081031/00/DF74DA9B-795E-4CE8-B39F-27D8A744B59A.html

 

Answer1:

这是今年10月阿里巴巴在西安的笔试题,面试时也问到:

虽然很简单,但优化算法不知如何写:

 

已知一个整数数组a,给定一个整数x,判断x是否数组a中某两个数之和?

 

我的算法是:

 

for(i=0;i <N;++i)

{

    for(j=i+1;j <N;++j)

    {

        if(x==a[i]+a[j])

            return 1;  //true

    }

}

return 0;    //false

 

 

Answer2:

1.首先对数组进行排序,用时O(nlgn);

2.对于数组中每个元素a,计算b=x-a,利用二分查找在数组里查找是否存在等于b的元素,用时O(nlgn)

总用时O(nlgn)

 

Answer3:

二楼的解法不错了,如果是我在面试时肯定也回答这个算法!

7楼算法是基于基数排序来的吧,那么算法还可以再直接点:

1.找出min,max

2.简历b[max-min]

3.for i in all numbers:

    b[numbers[i]-min] = 1

4.for j in b[]:

    if [b[x-b[j]-min]] = 1:

      break;

当然这里假设x>= max

复杂度降为O(n)

 

Answer4:

不用排序吧,就先扫一遍,或者用hash或者用bitmap,然后在扫一次,直接定位a对应的x-a是否存在就可以了。

时间复杂度就是0n),不过建议用bitmaphash处理冲突会带来额外的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyf31

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值