一、简答题
1、比较动态链接库与静态链接库的优劣。
2、轮转式调度与抢占式调度的区别。
3、数据库中常用的锁有哪些?简述其使用场合。
二、算法题
1、给一个定义:对一个整数,若其中存在相邻两位上的数字相同,则称其为“重复的数”;现给定一个正整数n,求大于n的最小的非“重复的数”。
思路:第一题中只要从高位出发找到不满足条件的就可以了。比如19922884,从高位出发99就不满足条件,要向增大的方向出发,所以199要加1,变成200又不满足条件,只有变成201,而后面的完全可以忽略了,满足相邻不重复且最小的只能用0和1填充。所以19922884------20101010.那么可以很快地写出来了,26677833----26701010,
36377777--36378010等等。
#include <iostream>
using namespace std;
int myItoa(int num, char* dst){
int iCnt=0, tempNum=num;
while(tempNum != 0){
++iCnt;
tempNum /= 10;
}
char* tail = dst + iCnt-1;
*(tail+1) = '\0';
tempNum = num;
while(tempNum != 0){
*tail-- = tempNum%10;
tempNum /= 10;
}
return iCnt;
}
int convert(int n){
if(n <= 0){
return -1;
}
char strN[20];
*strN = 0;
int iCnt = myItoa(n, strN+1);
for(int pre = 1, p = 2; p <= iCnt; ){
if(strN[pre] == strN[p] && strN[p] != (char)9){
++strN[p];
bool flag = true;
while(++p <= iCnt){
strN[p] = flag ? 0:1;
flag = !flag;
}
break;
}
else if(strN[pre] == strN[p] && strN[p] == (char)9){
++strN[pre-1];
while(pre <= iCnt && strN[pre] == (char)9){
strN[pre++] = 0;
}
pre = p-1;
for(bool flag = true; p <= iCnt; ++p, flag = !flag){
strN[p] = flag ? 0:1;
}
p = pre+1;
}else{
pre = p++;
}
}
for(int i =0; i <= iCnt; ++i){
cout<<(int)strN[i];
}
cout<<endl;
int result = 0;
for(int i =0; i <= iCnt; ++i){
result = result*10 + (int)strN[i];
}
return result;
}
int main(){
int n = 10000;
cout<<n<<'\t'<<convert(n)<<endl;
}
2、给定一个长度为N的串,求最长回文子串。
有O(N)复杂度算法,参考:http://www.felix021.com/blog/read.php?2040
3、给定一维数轴上的n个点a[0], a[1], ... a[n-1],现将一个长为L的棒子放在这个数轴上,求该棒子最多能覆盖多少个点。
有O(n)的算法,用两个变量分别标记棒子的两端:head, tail,若a[tail]-a[head]<L; 则++tail; 否则++head。遍历过程中记录tail-head的最大值即可。
三、系统设计题
1. 在现代系统的设计过程中,为了减轻请求的压力,通常采用缓存技术,为了进一步提升缓存的命中率,同常采用分布是缓存方案。调度模块针对不同内容的用户请求分配给不同的缓存服务器向用户提供服务。请给出一个分布式缓存方案,满足如下要求:
1) 单台缓存服务器故障,整个分布式缓存集群,可以继续提供服务。
2)通过一定得分配策略,可以保证充分利用每个缓存服务的存储空间,及负载均衡。当部分服务器故障或系统扩容时,改分配策略可以保证较小的缓存文件重分配开销。
3)当不同缓存服务器的存储空间存在差异时,分配策略可以满足比例分配。