您的位置:首页 > 职场人生

面试1题解析

2012-04-11 16:04 190 查看
作者:Josunna

时间:2012年4月12日。

出处:http://blog.csdn.net/josunna

声明:版权所有,侵犯必究。如有转载,请注明出处,谢谢!

题目:有从1到n共n个数,乱序,随意去掉其中两个数,用O(n)的时间复杂度和O(1) 的空间复杂度求是哪两个数

 算法简单描述如下:

由于仅少了两个数,所以可证仅有两个链是开放的,其他的链都是闭合的。

1.标记访问过的元素

2.每次找到一个单向非闭合的链,就把它表头a[i]的下标i记录下来,并更改表头a[i]的值为表尾t。

3.最后输出记录下来的两个表尾,即是缺少的两个元素。

由1.2.保证了平均每个元素至多被访问两次。

为了简便仅举一例子说明:

为方便,考虑0到n-1这n个数

例如一共有6个数去掉了两个,3 和 5,输入为 4 2 0 1 ? ?

其中有两个链不是闭合的

a[3]=1 a[1]=2 a[2]=0 a[0]=4 a[4]=?

a[5]=?

这两个链的头的下标,即是缺少的元素

code:

/*
* 最坏情况下时间复杂度为2n即O(n),空间复杂度为O(1) 数组的每个元素平均最多被访问两次。
*/
void find2ofnt(vector<int> &a, int &n1, int &n2){
int n = a.size()+2;
n1 = n-1; n2 = n-2;
for(int i=0, t=0; i<a.size(); ++i){
if (0>a[i]) continue;
t=i;
do {
int tp=a[t]; a[t]=-1; t=tp;
}while (0<=t && t<n-2 && t!=i);
a[i]=t;
if (0>t || t==i) continue;
n-1==t ? n1=i:n2=i;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试 n2 算法