百度2011面试题+答案解析

1、进程切换需要注意哪些问题?

 

 

 

2、输入一个升序数组,然后在数组中快速寻找两个数字,其和等于一个给定的值。

 

 

 

3、有一个名人和很多平民在一块,平民都认识这个名人,但是这个名人不认识任何一个平民,任意两个平民之间是否认识是未知的,请设计一个算法,快速找个这个人中的那个名人。  已知已经实现了一个函数  bool know(int a,int b) 这个函数返回true的时候,表明a认识b,返回false的时候表明a不认识b。

 

 

 

4、有一类数组,例如书序[1,2,3,4,6,8,9,4,8,11,18,19,100] 前半部分是是一个递增数组,后面一个还是递增数组,但整个数组不是递增数组,那么怎么最快的找出其中一个数?

 

 

 

5、判断一个自然数是否是某个数的平方。当然不能使用开方运算。

 

参考答案(欢迎讨论)转载请注明来源http://www.cnblogs.com/jerry19880126/

1. 进程“上下文切换”问题,将旧进程状态保存在其PCB(进程控制块)中,然后装入经调度要执行的新进程的PCB。

 

2. 两个指针low和high,一个指向数组首,一个指向数组尾。

If(a[low]+a[high] == target) 返回a[low]和a[target]

Else if(a[low] + a[high] < target)

{

           向右移动low,直到a[low]+a[high]>=target为止

}

Else

{

           向左移动high,直到a[low]+a[high]<=target

}

++low, --high

直到low>=high为止

算法复杂度为O(N)

 

 

3. 设有N个人,将之两两分组,A1B1, A2B2, …, AN/2, BN/2(或者A(N/2+1)挂单)

然后两两比较,即know(A1, B1), know(A2, B2), …

分析返回的结果,若淘汰结果为true的Ai,即若know(Ai, Bi) = true,则淘汰Ai,对剩下的所有人再进行分组,并重复淘汰,直到剩下最后一个人为止,总共比较N次,所以算法复杂度为O(N)

 

4. 第一步是找出两个数组的分界线,有两个,一个是前一个数组的最末元素,另一个是后一个数组的最初元素,分别设为preMax和aftMin。

第二步分析要查找的数,若此数刚好等于preMax或aftMin,则返回相应位置,否则,若此数小于preMax,则在前一个数组二分查找,若此数大于aftMin,则在后一个数组二分查找

算法复杂度为O(N)+O(logN)+O(logN)=O(N)

 

5. 判断自然数x是否是某个数y的平方。

若y本身是给定的,则直接return x/y = y? true: false;

题目想表达的意思应该是y是未知的,要去查找。

注意x有自然数的限制,所以可以用二分查找法。

Low = 1;

High = x;

循环:

Mid = (low + high) / 2;

If(mid * mid == x) return mid;

Else if(mid * mid < x) low = mid + 1;

Else high = mid – 1;

重复以上步骤直到low > high为止

 

算法复杂度为O(logx)

posted @ 2012-08-06 09:20  Jerry19880126  阅读(1591)  评论(0编辑  收藏  举报