联想五道笔试题 答案

来源:互联网 发布:cms系统怎么用 编辑:程序博客网 时间:2024/05/01 19:06
联想五道笔试题

37、

1)、设计函数  int atoi(char *s) 。 

2)、int i=(j=4,k=8,l=16,m=32); printf( “%d”, i);  输出是多少?
3)、解释局部变量、全局变量和静态变量的含义。
4)、解释堆和栈的区别。

5)、论述含参数的宏与函数的优缺点。


38、顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如:如果输入如下矩阵:
1               2               3               4
5     6               7               8
9               10              11              12
13              14              15              16
则依次打印出数字 1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10 。
分析:包括 Autodesk、EMC 在内的多家公司在面试或者笔试里采用过这道题。
 
39、对称子字符串的最大长度
题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。
比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出 4。
分析:可能很多人都写过判断一个字符串是不是对称的函数,这个题目可以看成是该函数的
加强版。
 
40、用 1、2、2、3、4、5 这六个数字,写一个 main 函数,打印出所有不同的排列,
如:512234、412345 等,要求:"4"不能在第三位,"3"与"5"不能相连.

41、微软面试题
一个有序数列,序列中的每一个值都能够被 2 或者 3 或者 5 所整除, 1 是这个序列的第一个
元素。求第 1500 个值是多少?


解答:

37、
1)、设计函数  int atoi(char *s) 。

同第89题:http://blog.csdn.net/u012605629/article/details/40454357
 
2)、int i=(j=4,k=8,l=16,m=32); printf( “%d”, i);  输出是多少?
 32

3)、解释局部变量、全局变量和静态变量的含义。

C++变量根据定义的位置的不同的生命周期,具有不同的作用域,
作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。

从作用域看:
全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。
当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。

静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,
它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,
而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。

静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,
它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。
这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。

从分配内存空间看:
全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,
而局部变量在栈里分配空间

全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,
当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 
即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,
只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

    1)、静态变量会被放在程序的静态数据存储区(数据段)(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。
这一点是它与堆栈变量和堆变量的区别。
 2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。

把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。

Tips:
A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;
D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

static 全局变量:改变作用范围,不改变存储位置
static 局部变量:改变存储位置,不改变作用范围
静态函数 :在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。
如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数也称为内部函数。
定义一个内部函数,只需在函数类型前再加一个“static”关键字即可。


4)、解释堆和栈的区别
栈区(stack)
1、— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 
2、由系统自动分配,速度较快,但程序员无法控制。声明在函数中一个局部变量&nbspint b; 系统自动在栈中为b开辟空间 。 
3、只要栈的剩余空间大于所申请空间,系统将为程序提供内存,如果申请空间超过栈剩余空间时,将提示overflow。 
4、在Windows下,栈是高地址向低地址扩展的数据结构,是一块连续的内存的区域,栈的大小是2M。 
5、栈由系统自动分配函数调用时,第一个进栈的是主函数中后的下一条指令的地址,然后是函数的各个参数。 
6、在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。  
 
堆区:
1、一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。 
2、注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,需要程序员自己申请,并指明大小,在c中malloc函数 
在C++中用new运算符。首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时在链表中寻找, 
另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。  
3、堆是低地址向高地址扩展的数据结构,是不连续的内存区域。链表的遍历方向是由低地址向高地址。 
4、堆的大小受限于计算机系统中有效的虚拟内存。 
5、堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便,一般是在堆的头部用一个字节存放堆的大小。

5)、论述含参数的宏与函数的优缺点。
1.函数调用时,先求出实参表达式的值,然后带入形参。而使用带参的宏只是进行简单的字符替换。
2.函数调用是在程序运行时处理的,分配临时的内存单元;而宏展开则是在编译时进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。
3.对函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致,应进行类型转换;而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时带入指定的字符即可。宏定义时,字符串可以是任何类型的数据。
4.调用函数只可得到一个返回值,而用宏可以设法得到几个结果。
5.使用宏次数多时,宏展开后源程序长,因为每展开一次都使程序增长,而函数调用不使源程序变长。
6.宏替换不占运行时间。而函数调用则占运行时间(分配单元、保留现场、值传递、返回)。

一般来说,用宏来代表简短的表达式比较合适

38、顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如:如果输入如下矩阵:
1               2               3               4
5               6               7               8
9               10              11              12
13              14              15              16
则依次打印出数字 1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10 。
分析:包括 Autodesk、EMC 在内的多家公司在面试或者笔试里采用过这道题。


 已实现:http://blog.csdn.net/u012605629/article/details/40950983


39、对称子字符串的最大长度
题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。
比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出 4。分析:可能很多人都写过判断一个字符串是不是对称的函数,这个题目可以看成是该函数的加强版。


已实现:同73  http://blog.csdn.net/u012605629/article/details/40158899


40、用 1、2、2、3、4、5 这六个数字,写一个 main 函数,打印出所有不同的排列,如:512234、412345 等,要求:"4"不能在第三位,"3"与"5"不能相连.


已实现: http://blog.csdn.net/u012605629/article/details/40951031

41、微软面试题
一个有序数列,序列中的每一个值都能够被 2 或者 3 或者 5 所整除, 1 是这个序列的第一个元素。求第 1500 个值是多少?


已实现:http://blog.csdn.net/u012605629/article/details/40951067


0 0