1、深信服科技 2011 校园招聘笔试题一、 选择题(单选多选都有,每题 2 分,时间:120 分钟)1. 正则表达式 (a | b) + 0 - 9*c 可匹配下列哪些字符串?( )A. abacB. 90cC. aba10cD. ac2. 已知 a, b 都是 double 类型,下列哪些判断 a, b 相等的方法是正确的?( )A. a = bB. fabs(a-b) pnext;elsephead = plast = prhs;prhs = prhs-pnext;while(_)if(plhs-val val)plast-pnext = plhs;plast = plhs;plhs = p
2、lhs-pnext;elseplast-pnext = prhs;plast = prhs;prhs = prhs-pnext;plast-pnext = _;return _;3. 一个正整数 n, 可以分解为多个小于等于 n 的正整数的和,表达式右部的各个正整数要求都是 2 的幂,例如给定正整数 4、7,它们可以分解得到如下表达式:4 = 1+1+1+1 7 = 1+1+1+1+1+1+14 = 1+1+2 7 = 1+1+1+1+1+24 = 2+2 7 = 1+1+1+2+24 = 4 7 = 1+1+1+47 = 1+2+2+27 = 1+2+4因此,正整数 4、7 可以得到的表达式
3、个数分别是 4 个和 6 个,下列程序可以计算给定正整数 n(0 n 10000) 的和式个数,请补充其中空缺。_int64 calc(int n)int i;int size = _;_int64* w = (_int64*)malloc(size);if(!w)abort():_int64 ret = 0;_;_;for(i=3; i=n; i+)if(i%2)wi = _;elsewi = _;ret = wn;free(w);return ret;四、 问答题(每题 5 分,共 25 分)1. 下列代码期望输出结果是 1111,请找出 fun1.fun4 中存在的问题,并简单说明原因:
4、1) int* fun1(int a) 问题 1:返回局部变量的地址 问题 2 第二次调用时将覆盖第一次的结果所以等到的是 02) int ret = a;3) Return 4) 5) int* fun2(int a)6) int* p = (int*)malloc(sizeof(int); 可以得到 1 但是没有释放在堆中分配的内存7) *p = a;8) return p;9) 10) int* fun3(int a) 等到的是 0 因为静态局部变量只在第一次调用时分配空间初始化一 次,以后调用孔用此空间11) static int ret; static int a=5;这个是初始化
5、a=6 这个是赋值12) ret = a;13) return 14) 15) int* fun4(int a)16) return 17) 18) int main()19) 20) printf(“%d”, *fun1(2)-*fun1(1);21) printf(“%d”, *fun2(2)-*fun2(1);22) printf(“%d”, *fun3(2)-*fun3(1);23) printf(“%d”, *fun4(2)-*fun4(1);24) return 0;25) 2. 怎么查找产生内存泄漏的代码位置,请至少写出三种不同类型的方法:3. C 语言中的 main 函数的返回
6、值有什么作用?如何通过 C 代码取得该返回值?main 函数的返回值类型必须是 int ,这样返回值才能传递给操作系统。如果 main 函数的最后没有写 return 语句的话,C99 规定编译器要自动在生成的目标文件中(如 exe 文件)加入 return 0,表示程序正常退出。不过,我还是建议你最好在 main 函数的最后加上 return 语句,虽然没有这个必要,但这是一个好的习惯。注意,vc6 不会在生成的目标文件中加入 return 0 ,大概是因为 vc6 是 98 年的产品,所以才不支持这个特性。现在明白我为什么建议你最好加上 int main()返回整数( 通常和 return
7、 0)连用,返回 0,告诉系统程序正常终止,返回非零值告诉系统程序异常关闭.打开附件里的“命令提示符” ,在命令行里运行刚才编译好的可执行文件,然后输入“echo%ERRORLEVEL%”,回车,就可以看到程序的返回值为 0。假设刚才编译好的文件是 a.exe,如果输入“a & dir”,则会列出当前目录下的文件夹和文件。但是如果改成“return -1”,或者别的非 0 值,重新编译后输入“a & dir”,则dir 不会执行。因为&的含义是:如果&前面的程序正常退出,则继续执行& 后面的程序,否则不执行。也就是说,利用程序的返回值,我们可以控制要不要执行下一个程序。这就是 int main
8、 的好处。如果你有兴趣,也可以把 main 函数的返回值类型改成非 int 类型(如 float) ,重新编译后执行“a & dir”,看看会出现什么情况,想想为什么会出现那样的情况。顺便提一下,如果输入 a | dir 的话,则表示如果 a异常退出,则执行 dir4. 汉诺塔问题:有 A、B、C 三个台子,每个台子上面可放若干个盘子,要求每个盘子下面的盘子都比自己大。现在要从 A 台移 10 个盘子到 B 台,每次只能移动一个盘子,可以借助 C 台,问:一共要移动几次盘子,请写出计算过程。5. 近来有人声称发明了一类神奇的直角三角形,其每一条边的长度都是互不相等的 Fibonacci 数,
9、聪明的你能找到这样的三角形吗? 如果能,请写出符合条件的三个数值,如果不能,请写出分析过程,Fibonacci 数:满足:f(1) = 1, f(2) = 1, f(n) = f(n-1) + f(n-2)。五、 编程题(20 分)1. 编写函数 align_n, 将 size 的低 n 位(即:0 到 n-1 位) 清零,如果 size 的低 n 位不为函数原型:unsigned int align_n(unsigned int size, int n)2. 计算 a 的 n 次方是许多加密算法的基本操作, 蛮力计算方法的复杂度是 O(n),请设计一个时间复杂度小于 O(n)的算法, (假设计算结果可以使用 long 型存储) 。 (6 分)3. 不调用库函数实现 split_ext,该函数作用是从 WINDOWS 格式路径中提取文件的后缀名,函数原型:char* split_ext(const char* pszPath, char* ext)需要正确处理以下格式路径:C:Dlan Findme clientxxxxC:Dlan Findme clienthello.jpg.docC:Dlan Findme clienttest.testhelloC:Dlan Findme clienttest.testhello.c