百度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)