题目四:
http://topic.youkuaiyun.com/u/20081012/14/3CC93688-1F7F-4985-806C-3F729C78261B.html
有两个有序整数集合a和b,写一个函数找出它们的交集?
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.youkuaiyun.com/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是否存在就可以了。
时间复杂度就是0(n),不过建议用bitmap,hash处理冲突会带来额外的问题。