腾讯2014校园招聘软件开发类笔试试题
把基本经典的书籍认真看看,那些笔试面试的都不是什么问题。但是,专门的突击和训练还是很有必要的。
考试时长:120分钟
一 不定项选择题(共25题,每题4分,共100分,少选、错选、多选均不得分)
1 已知一棵二叉树,如果先序遍历的节点顺序是:ADCEFGHB,中序遍历是:CDFEGHAB,则后序遍历结果为:()
A.CFHGEBDA B.CDFEGHBA C.FGHCDEBA D.CFHGEDBA
解析:由先序遍历序列和中序遍历序列可以唯一确定树的结构
步骤: 由先序序列确定根节点;按根节点把中序序列分为两端,前面的是左子树,后面的是右子树;对左右子树重复前面的步骤
还原树形结构:
根节点:A
D B
C E
F G
H
后续遍历序列:CFHGEDBA
答案选 D
2 下列哪两个数据结构,同时具有较高的查找和删除性能?()
A.有序数组 B.有序链表 C.AVL树 D.Hash表
解析:几种常见的数据结构的操作性能对比如下图所示
由上图可见,平衡二叉树的查找,插入和删除性能都是O(logN),其中查找和删除性能较好;哈希表的查找、插入和删除性能都是O(1),都是最好的。
答案:CD
3 下列排序算法中,哪些时间复杂度不会超过nlogn?(BC)
A.快速排序 B.堆排序 C.归并排序 D.冒泡排序
解析:几种常见的排序算法对比:
排序法 |
平均时间 |
最差情形 |
稳定度 |
额外空间 |
备注 |
冒泡 |
O(n2) |
O(n2) |
稳定 |
O(1) |
n小时较好 |
交换 |
O(n2) |
O(n2) |
不稳定 |
O(1) |
n小时较好 |
选择 |
O(n2) |
O(n2) |
不稳定 |
O(1) |
n小时较好 |
插入 |
O(n2) |
O(n2) |
稳定 |
O(1) |
大部分已排序时较好 |
基数 |
O(logRB) |
O(logRB) |
稳定 |
O(n) |
B是真数(0-9), R是基数(个十百) |
Shell |
O(nlogn) |
O(ns) 1<s<2 |
不稳定 |
O(1) |
s是所选分组 |
快速 |
O(nlogn) |
O(n2) |
不稳定 |
O(nlogn) |
n大时较好 |
归并 |
O(nlogn) |
O(nlogn) |
稳定 |
O(1) |
n大时较好 |
堆 |
O(nlogn) |
O(nlogn) |
不稳定 |
O(1) |
n大时较好 |
答案:BC
4 初始序列为1 8 6 2 5 4 7 3一组数采用堆排序,当建堆(小根堆)完毕时,堆所对应的二叉树中序遍历序列为:()
A.8 3 2 5 1 6 4 7
B.3 2 8 5 1 4 6 7
C.3 8 2 5 1 6 7 4
D.8 2 3 5 1 4 7 6
解析:
堆排序:利用堆的性质进行的一种选择排序
答案:A
5 当n=5时,下列函数的返回值是:()
int foo(int n)
{
if(n<2)return n;
return foo(n-1)+foo(n-2);
}
A.5 B.7 C.8 D.10
解析:直接展开结算。。
答案:A
6 S市A,B共有两个区,人口比例为3:5,据历史统计A的犯罪率为0.01%,B区为0.015%,现有一起新案件发生在S市,那么案件发生在A区的可能性有多大?()
A.37.5% B.32.5% C.28.6% D.26.1%
解析:犯罪率可以理解为AB两区的犯罪人数与总人口数的比。由此不难列出下式:
( 3*0.01% ) / ( 3*0.01% + 5*0.015% ) = 0.2587 = 28.6%
答案:C
7 Unix系统中,哪些可以用于进程间的通信?()
A.Socket B.共享内存 C.消息队列 D.信号量
解析:
3种System V进程通信方式:信号量,消息队列和共享内存 详细请参考:服务器编程入门(8)多进程编程
socket,表示IP地址和端口对,是Linux网络编程的基础,详细请参考:服务器编程入门(4)Linux网络编程基础API
使用套接字除了可以实现网络间不同主机间的通信外,还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。socket进程通信与网络通信使用的是统一套接口,只是地址结构与某些参数不同。
答案:ABCD
8 静态变量通常存储在进程哪个区?()
A.栈区 B.堆区 C.全局区 D.代码区
解析:
静态变量的修饰关键字:static,又称静态全局变量。
静态变量属于静态存储方式,但是属于静态存储方式的变量不一定就是静态变量。
全局区在内存中所占的位置:
答案:C
9 查询性能()
A. 在Name字段上添加主键
B. 在Name字段上添加索引
C. 在Age字段上添加主键
D. 在Age字段上添加索引
解析:
索引:对数据库表中一列或多列的值进行排序(或构成特定的数据结构,如树或哈希表)的一种结构,使用索引可快速访问数据库表中的特定信息。
优点:
- 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
- 可以大大加快数据的检索速度
- 可以加快表与表之间的连接
- 使用分组和排序子句进行检索时,同样可以显著减少查询中分组和排序的事件
- 在查询的过程中优化隐藏器,提高系统的性能
缺点:
- 创建和维护所以你需要耗费时间
- 索引需要占物理空间,如果建立聚簇索引,需要的空间更大
- 表的数据更新时,索引也要动态的维护
建立索引的规则:
- 表的主键、外键必须有索引;
- 数据量超过300的表应该有索引;
- 经常与其他表进行连接的表,在连接字段上应该建立索引;
- 经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
- 索引应该建在选择性高的字段上;
- 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
- 复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
- 正确选择复合索引中的主列字段,一般是选择性较好的字段;
- 复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
- 如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
- 如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
- 如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
- 频繁进行数据操作的表,不要建立太多的索引;
- 删除无用的索引,避免对执行计划造成负面影响;
答案:B
10 IP地址131.153.12.71是一个()类IP地址。
A.A B.B C.C D.D
解析:IP地址分类
A类网络的IP地址范围为1.0.0.1-127.255.255.254;
B类网络的IP地址范围为:128.1.0.1-191.255.255.254;
C类网络的IP地址范围为:192.0.1.1-223.255.255.254。
子网划分:
答案:B
11 下推自动识别机的语言是:()
A. 0型语言 B.1型语言 C.2型语言 D.3型语言
解析:
在自动机理论中,下推自动机(Pushdown automaton)是使用了包含数据的栈的有限自动机。使用的语言为2型语言。
12 下列程序的输出是:()
#define add(a+b) a+b
int main()
{
printf(“%d\n”,5*add(3+4));
return 0;
}
A.23 B.35 C.16 D.19
解析:
宏是完全的文本替换,宏替换时容易犯的错误。使用宏时,带上括号是安全的做法。
答案:D
13 浏览器访问某页面,HTTP协议返回状态码为403时表示:(B)
A 找不到该页面
B 禁止访问
C 内部服务器访问
D 服务器繁忙
解析:
找不到该页面:404
禁止访问:403
内部服务器访问:500
服务器繁忙:503
详细请参考:HTTP状态码
答案:B
14 如果某系统15*4=112成立,则系统采用的是()进制。
A.6 B.7 C.8 D.9
解析:
就不一个一个算了,直接拿六进制转为十进制验证。
需要注意的是,当选定六进制时,15,4 和112都应该为六进制。
15由六进制转为十进制为11,计算方法:1*6 + 5*1 = 11
同理:4转为十进制为4,112转为十进制为44
所以转换后的等式左边为 11*4, 右边为44。相等。
所以,答案为A。
15 某段文本中各个字母出现的频率分别是{a:4,b:3,o:12,h:7,i:10},使用哈夫曼编码,则哪种是可能的编码:(A)
A a(000) b(001) h(01) i(10) o(11)
B a(0000) b(0001) h(001) o(01) i(1)
C a(000) b(001) h(01) i(10) o(00)
D a(0000) b(0001) h(001) o(000) i(1)
解析:
先创建一个哈夫曼树
- 将每个英文字母依照出现频率由小排到大,最小在左,组成一个序列
- 每个字母都代表一个终端节点(叶节点),比较每个字母的出现频率,将最小的两个字母频率相加合成一个新的节点,将两个字母从序列中删除,将生成的节点加入到字母队列中
- 重复前面两步,直到序列中没有字母为止
- 给霍夫曼树的所有左链结'0'与右链结'1'
- 从树根至树叶依序记录所有字母的编码
答案:A
16 TCP和IP分别对应了OSI中的哪几层?()
A Application layer
B Presentation layer
C Transport layer
D Network layer
解析:
网络分层模型:
具体请参考:服务器编程入门(1)TCP/IP协议族
答案:CD
17 一个栈的入栈序列是A,B,C,D,E,则栈的不可能的输出序列是?()
A.EDCBA B.DECBA C.DCEAB D.ABCDE
解析:
画一下就出来了。。画不出来的面壁去。。
答案:C
18 同一进程下的线程可以共享以下?(BD)
A. stack B.data section C.register set D.file fd
解析:
线程共享的内容包括:
- 进程代码段
- 进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、
- 进程打开的文件描述符、
- 信号的处理器、
- 进程的当前目录和
- 进程用户ID与进程组ID
线程独有的内容包括:
- 线程ID
- 寄存器组的值
- 线程的堆栈
- 错误返回码
- 线程的信号屏蔽码
19 对于派生类的构造函数,在定义对象时构造函数的执行顺序为?()
1:成员对象的构造函数
2:基类的构造函数
3:派生类本身的构造函数
A.123 B.231 C.321 D.213
解析:
当派生类中不含对象成员时
- 在创建派生类对象时,构造函数的执行顺序是:基类的构造函数→派生类的构造函数;
- 在撤消派生类对象时,析构函数的执行顺序是:派生类的构造函数→基类的构造函数。
- 在定义派生类对象时,构造函数的执行顺序:基类的构造函数→对象成员的构造函数→派生类的构造函数;
- 在撤消派生类对象时,析构函数的执行顺序:派生类的构造函数→对象成员的构造函数→基类的构造函数。
答案:D
20 如何减少换页错误?()
A 进程倾向于占用CPU
B 访问局部性(locality of reference)满足进程要求
C 进程倾向于占用I/O
D 使用基于最短剩余时间(shortest remaining time)的调度机制
解析:
没看到确切的答案,有一个答案,说的还算合理吧,参考一下:如何减少换页错误?
答案:BD
21 递归函数最终会结束,那么这个函数一定?()
A 使用了局部变量
B 有一个分支不调用自身
C 使用了全局变量或者使用了一个或多个参数
D 没有循环调用
解析:
直接排除AD,注意力集中在B和C。
B肯定是对的,只有一次循环满足某个条件,不调用自己就返回,递归才会一层一层向上返回。
那么C呢,想一下,全局变量和参数确实可以用来控制递归的结束与否。
该不该选C呢?再仔细看一下题目(说实话,我很讨厌这种文字游戏),“这个函数一定...“,所以,问题集中在,是否是一定会使用这两种方式呢?
显然不是的。除了C中提到的两种情况外,还有如下控制递归的方式:
- 局部静态变量是可以控制递归函数最终结束的
- 可能通过异常来控制递归的结束。
- 可以利用BIOS或OS的一些数据或一些标准库的全局值来控制递归过程的终止。
- 可以把一些数据写入到BIOS或OS的系统数据区,也可以把数据写入到一个文件中,以此来控制递归函数的终止。
22 编译过程中,语法分析器的任务是()
A 分析单词是怎样构成的
B 分析单词串是如何构成语言和说明的
C 分析语句和说明是如何构成程序的
D 分析程序的结构
解析:
字面理解就可以了。
答案选B
23 同步机制应该遵循哪些基本准则?(ABCD)
A.空闲让进 B.忙则等待 C.有限等待 D.让权等待
解析:
同步机制应该遵循的基本准则
- 空闲让进:当无进程处于临界区时,表明临界资源处于空闲状态,允许一个请求进入临界区的进程立即进入临界区,以有效利用临界资源
- 忙则等待:当已有进程处于临界区时,表明临界资源正在被访问,因而其他试图进入临界区的进程必须等待,以保证对临界资源的互斥访问
- 有限等待:对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入“死等”状态
- 让权等待:当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态
24 进程进入等待状态有哪几种方式?(D)
A CPU调度给优先级更高的线程
B 阻塞的线程获得资源或者信号
C 在时间片轮转的情况下,如果时间片到了
D 获得spinlock未果
解析:等待状态应该是我们说的阻塞态,因为一般阻塞态是在等待某一触发时间的发生,才能进入就绪状态。
25 设计模式中,属于结构型模式的有哪些?(BC)
A 状态模式 B 装饰模式 C 代理模式 D 观察者模式
解析:
结构型模式包括:
设计模式 |
GoF的描述 |
我的理解 |
Adapter适配器模式 |
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的类可以一起工作 |
转换接口,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是,新环境要求的接口是现存对象所不满足的,此时我们可以通过添加一层Adapter对现有的对象加入一些接口,使其适应新的应用环境。 |
Bridge桥接模式 |
将抽象部分与实现部分分离,使他们可以独立的变化 |
分离接口(抽象)与其实现,当某个类型具有两个或两个以上的纬度变化(或者说是变化点),通过以继承接口的方式隔离变化,以减少因变化带来的代码的修改量。 |
Composite组合模式 |
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得客户对单个对象和组合对象的使用具有一致性 |
解决客户程序与复杂对象容器的解耦,一类具有“容器特征”的对象——即他们在充当对象的同时,又是其他对象的容器的情况,通过继承统一的接口,我们可以将容器对象及其子对象看成同一类对象使用,以减少对象使用中的复杂度。 |
Decorator装饰模式 |
动态的给一个对象添加一些额外的职责。就增加功能而言,Decorator模式比生成子类更为灵活 |
在稳定接口的前提下为对象扩展功能,主要是解决用继承的方式为对象扩展大量功能而造成的子对象数量膨胀的问题 |
Facade外观模式 |
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 |
简化接口,对于复杂子系统或子对象调用的封装。从客户程序角度看,只能看见Facade提供的接口。换句话说是对子对象调用的封装,将客户程序对子对象的调用与子对象的变化分离。 |
Flyweight享元模式 |
运用共享技术有效的支持大量细粒度的对象 |
主要是解决由于相同对象数量过大而造成系统内存开销过大的问题。实际上是相同的对象引用指向同一个对象空间。在使用Flyweight模式前要做一个评估,如果使用不当会适得其反 |
Proxy代理模式 |
为其他对象提供一种代理以控制这个对象的访问 |
解决直接访问某些对象是出现的问题,如:访问远程的对象 |
二、填空题(共4题10个空,每空2分,共20 分)
1 设有字母序列{Q,D,F,X,A,P,N,B,Y,M,C,W},请写出按二路归并方法对该序列进行一趟扫描后的结果为( )。
答案:DQFXAPBNMYCW
解析:二路归并:如果序列中有n 个记录,可以先把它看成n个子序列,每个子序列中只包含一个记录,因而都是排好序的。二路归并排序先将每相邻的两个子序列合并,得到n/2(向上取整)个较大的有序子序列,每个子序列包含2个记录。再将这些子序列两两合并。如此反复,直到最后合并成一个有序序列,排序即告完成。
2 关键码序列(Q,H,C,Y,Q,A,M,S,R,D,F,X),要按照关键码值递增的次序进行排序,若采用初始步长为4的Shell的排序法,则一趟扫描的结果是( );若采用以第一个元素为分界元素的快速排序法,则扫描一趟的结果是( )。
答案:QACSQDFXRHMY
FHCDQAMQRSYX
3 二进制地址为011011110000,大小为(4)10和(16)10块的伙伴地址分别为:_________,_________。
4 设t是给定的一棵二叉树,下面的递归程序count(t)用于求得:( )
- typedef struct node
- {
- int data;
- struct node *lchild,*rchild;
- }node;
- int N2,NL,NR,N0;
- void count(node *t)
- {
- if (t->lchild!=NULL)
- if (t->rchild!=NULL) N2++;
- else NL++;
- else if (t->rchild!=NULL) NR++;
- else N0++;
- if(t->lchild!=NULL) count(t->lchild);
- if(t->rchild!=NULL) count(t->rchild);
- }/* call form :if(t!=NULL) count(t);*/
二叉树t中具有非空的左、右两个儿子的结点个数N2;只有非空左儿子的个数NL;只有非空右儿子的结点个数NR和叶子结点个数N0。N2,NL,NR、N0都是全局量,且在调用count(t)之前都置为0。
三、其他方向简答题(共2题,每题20分),选作题,不计入总分)
1 请设计一个排队系统,能够让每个进入队伍的用户都能看到自己在队列中所处的位置和变化,队伍可能随时有人加入和退出;当有人退出影响到用户的位置排名时需要及时反馈到用户。
2 A,B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
参考资料:
百度百科
维基百科
http://www.cnblogs.com/kid-li/archive/2006/11/11/557359.html 设计模式学习笔记(十五)——结构型模式总结
还参考了很多资料,一并谢过,就不一一列举了