我大学的时候,就有些博客的习惯。今天翻回去看之前写的博客,觉得有些幼稚,也有些惊喜。比如17 年初写的腾讯软件开发面试题还挺多人阅读评论的,这是我意想不到的,今天也整理一下,发出来给大家看下。
1、已知一棵二叉树,如果先序遍历的节点顺序是:ADCEFGHB ,中序遍历是:CDFEGHAB ,则后序遍历结果为:( )
A. CFHGEBDA
B. CDFEGHBA
C. FGHCDEBA
D. CFHGEDBA
对于二叉树的遍历方式一般分为三种先序、中序、后序三种方式:
- 先序遍历(根左右)
若二叉树为空,则不进行任何操作:否则
1、访问根结点。
2、先序方式遍历左子树。
3、先序遍历右子树。 - 中序遍历 (左根右)
若二叉树为空,则不进行任何操作:否则
1、中序遍历左子树。
2、访问根结点。
3、中序遍历右子树。 - 后序遍历 (左右根)
若二叉树为空,则不进行任何操作:否则
1、后序遍历左子树。
2、后序遍历右子树。
3、放问根结点。
因此,根据题目给出的先序遍历和中序遍历,可以画出二叉树:
最后结果选择:D
2、下列哪两个数据结构,同时具有较高的查找和删除性能?( )
A. 有序数组
B. 有序链表
C. AVL 树
D. Hash 表
看看下图几种常见的数据结构操作性能:
数组的删除性能比较差,而链表的查找性能比较差。
平衡二叉树的查找,插入和删除性能都是 O(logN) ,查找和删除性能较好;哈希表的查找、插入和删除性能都是 O(1) ,都是最好的。所以最后的结果选择:CD
3、下列排序算法中,哪些时间复杂度不会超过 nlogn?( )
A. 快速排序
B. 堆排序
C. 归并排序
D. 冒泡排序
根据上图,观察平均情况,最好最差情况的时间复杂度基本可以知道答案了,最后结果选择: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
初始化序列:1 8 6 2 5 4 7 3 ,,小根堆就是要求结点的值小于其左右孩子结点的值,左右孩子的大小没有关系,那么小根堆排序之后为:1 2 4 3 5 6 7 8;
中序遍历:左根右,故遍历结果为:8 3 2 5 1 6 4 7,也就是选项:A
5、当 n = 5 时,下列函数的返回值是:( )
[cpp] view plaincopy int foo(int n) { if(n<2)return n; return foo(n-1)+foo(n-2); }
A.5
B.7
C.8
D.1
递归,最笨的方法,把数代进去,就可以知道结果了,所以最后结果选: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%
这道题首先得了解犯罪率是什么?
犯罪率就是犯罪人数与总人口数的比。因此可以直接得出公式:
( 3 * 0.01% ) / ( 3 * 0.01% + 5 * 0.015% ) = 28.6%
当然如果不好理解的话,我们可以实例化解释一下,比如 B 区假设 5000 人,A 区 3000 人,A 区的犯罪率为 0.01%,那么 A 区犯罪人数为 30 人,B 区的犯罪率为 0.015% ,那么 B 区的犯罪人数为 75 人 ,求发生在 A 区的可能性,就是说 A 区的犯罪人数在总犯罪人数的多少,也就是 30/(30+75)=0.2857
当然,也可以回归到我们高中遗忘的知识:
假设C表示犯案属性
在A区犯案概率:P(C|A)=0.01%
在B区犯案概率:P(C|B)=0.015%
在A区概率:P(A)=3/8
在B区概率:P(B)=5/8
犯案概率:P(C)=(3/80.01%+5/80.015%)
根据贝叶斯公式:P(A|C) = P(A,C) / P(C) = [P(C|A) P(A)] / [ P(C|A) P(A)+ P(C|B) P(B) ] 也可以算出答案来
故,最后结果选择为:C
7、Unix系统中,哪些可以用于进程间的通信?( )
A.Socket
B.共享内存
C.消息队列
D.信号量
- 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
- 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
- 报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。 - 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
故最后选择的结果为:ABCD
8、静态变量通常存储在进程哪个区?( )
A.栈区
B.堆区
C.全局区
D.代码区
静态变量又称静态全局变量。故最后选择的结果为:C
9、查询性能( )
A. 在Name字段上添加主键
B. 在Name字段上添加索引
C. 在Age字段上添加主键
D. 在Age字段上添加索引
结果选: B
如果经常依据特定的字段搜索表或对表的记录进行排序,则可以通过创建该字段的索引来加快执行这些操作。
10、IP地址131.153.12.71是一个( )类IP地址。
A.A
B.B
C.C
D.D
故将 131 转为二进制 :10000011,因此为 B 类 IP 地址,结果选 B
11、下推自动识别机的语言是:( )
A.0型语言
B.1型语言
C.2型语言
D.3型语言
这是有关编译原理的。
乔姆斯基体系是计算机科学中刻画形式文法表达能力的一个分类谱系,是由诺姆·乔姆斯基于1956年提出的。它包括四个层次:
- 0-型文法(无限制文法或短语结构文法)包括所有的文法。该类型的文法能够产生所有可被图灵机识别的语言。可被图灵机识别的语言是指能够使图灵机停机的字串,这类语言又被称为递归可枚举语言。注意递归可枚举语言与递归语言的区别,后者是前者的一个真子集,是能够被一个总停机的图灵机判定的语言。
- 1-型文法(上下文相关文法)生成上下文相关语言。这种文法的产生式规则取如 αAβ -> αγβ 一样的形式。这里的A 是非终结符号,而 α, β 和 γ 是包含非终结符号与终结符号的字串;α, β 可以是空串,但 γ 必须不能是空串;这种文法也可以包含规则 S->ε ,但此时文法的任何产生式规则都不能在右侧包含 S 。这种文法规定的语言可以被线性有界非确定图灵机接受。
- 2-型文法(上下文无关文法)生成上下文无关语言。这种文法的产生式规则取如 A -> γ 一样的形式。这里的A 是非终结符号,γ 是包含非终结符号与终结符号的字串。这种文法规定的语言可以被非确定下推自动机接受。上下文无关语言为大多数程序设计语言的语法提供了理论基础。
- 3-型文法(正规文法)生成正规语言。这种文法要求产生式的左侧只能包含一个非终结符号,产生式的右侧只能是空串、一个终结符号或者一个非终结符号后随一个终结符号;如果所有产生式的右侧都不含初始符号 S ,规则 S -> ε 也允许出现。这种文法规定的语言可以被有限状态自动机接受,也可以通过正则表达式来获得。正规语言通常用来定义检索模式或者程序设计语言中的词法结构。
正规语言类包含于上下文无关语言类,上下文无关语言类包含于上下文相关语言类,上下文相关语言类包含于递归可枚举语言类。这里的包含都是集合的真包含关系,也就是说:存在递归可枚举语言不属于上下文相关语言类,存在上下文相关语言不属于上下文无关语言类,存在上下文无关语言不属于正规语言类。
四种类型的文法的主要特点:
因此答案选择:C
12、下列程序的输出是:( )
[cpp] view plaincopy
#define add(a+b) a+b int main() { printf(“%d”,5*add(3+4)); return ; }
A.23
B.35
C.16
D.19
这里主要看清楚 define ,#define 的本质就是一个代换,题目 #define add(a+b) a+b 表明了 add(a+b) 替换成 a+b ,因此代码输出的那一行其实是 printf(“%d”,5*3+4); ,所以最后的结果选择 D
13、浏览器访问某页面,HTTP 协议返回状态码为 403 时表示:( )
A. 找不到该页面
B. 禁止访问
C. 内部服务器访问
D. 服务器繁忙
这题直接给答案了,因为这是很基础的题目,无论是什么开发,都离不开网络了,而网络开发的核心就是 HTTP 协议,因此这是很基础的题目,这题的答案选择为:B
14、如果某系统 15*4=112 成立,则系统采用的是( )进制。
A.6
B.7
C.8
D.9
这题因为是选择题,我们可以直接从 A 的选项开始,假设是 6 进制的,我们把等式 15 * 4 = 112 转为十进制,就是 11 * 4 = 44,最后验证等式是否成立,明显等式是成立的,因此答案已经出来了,选择 A 。
当然我们也可以假设是 X 进制,且我们知道 X 大于 5, 则:(x+5)4 = xx +x +2,所以最后计算的结果也为 6
15、某段文本中各个字母出现的频率分别是{a:4,b:3,o:12,h:7,i:10},使用哈夫曼编码,则哪种是可能的编码:( )
A. a(001) b(000) 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)
关于哈夫曼树的知识点用的少了,就比较容易遗忘,但是一些注意的知识点还是要记住的。
关于哈夫曼树的注意点:
1、满二叉树不一定是哈夫曼树
2、哈夫曼树中权越大的叶子离根越近 (很好理解,WPL最小的二叉树)
3、具有相同带权结点的哈夫曼树不惟一
4、哈夫曼树的结点的度数为 0 或 2, 没有度为 1 的结点。
5、包含 n 个叶子结点的哈夫曼树中共有 2n – 1 个结点。
6、包含 n 棵树的森林要经过 n–1 次合并才能形成哈夫曼树,共产生 n–1 个新结点
哈夫曼树的应用很广,哈夫曼编码就是其在电讯通信中的应用之一。
广泛地用于数据文件压缩的十分有效的编码方法。其压缩率通常在 20%~90%之间。
在电讯通信业务中,通常用二进制编码来表示字母或其他字符,并用这样的编码来表示字符序列。
例:如果需传送的电文为 ‘ABACCDA’,它只用到四种字符,用两位二进制编码便可分辨。假设 A, B, C, D 的编码分别为 00, 01,10, 11,则上述电文便为 ‘00010010101100’(共 14 位),译码员按两位进行分组译码,便可恢复原来的电文。
好了,了解了相关的知识点,我们开始解题,首先,创建一个哈夫曼树,原则如下:
- 将每个英文字母依照出现频率由小排到大,最小在左,组成一个序列
- 每个字母都代表一个终端节点(叶节点),比较每个字母的出现频率,将最小的两个字母频率相加合成一个新的节点,将两个字母从序列中删除,将生成的节点加入到字母队列中
- 重复前面两步,直到序列中没有字母为止
好了,创建了哈夫曼树,最后我们进行编码,编码的规则如下:
- 给霍夫曼树的所有左链结 '0' 与右链结 '1'
- 从树根至树叶依序记录所有字母的编码
因此最后的结果为:a(001), b(000),h(01),i(10),o(11) ,选择 A
16、TCP 和 IP 分别对应了 OSI 中的哪几层?()
A. Application layer
B. Presentation layer
C. Transport layer
D. Network layer
看上面的网络分层模型图,所以最后的答案为 CD
17、一个栈的入栈序列是A,B,C,D,E,则栈的不可能的输出序列是?()
A.EDCBA
B.DECBA
C.DCEAB
D.ABCDE
堆栈分别是先进后出,后进先出,
选项 a 是 abcde 先入栈,然后依次出栈,正好是 edcba
选项 b 是 abcd 先依次入栈,然后 d 出栈, e 再入栈, e 出栈
选项 c 是错误的,不可能 a 先出栈
选项 d 是 a 入栈,然后 a 出栈;b 再入栈, b 出栈.依此类推
最后的结果选择 C
18、同一进程下的线程可以共享以下?( )
A.stack
B.data section
C.register set
D.file fd
线程共享的内容包括:
- 进程代码段
- 进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)
- 进程打开的文件描述符
- 信号的处理器
- 进程的当前目录和
- 进程用户ID与进程组ID
线程独有的内容包括:
- 线程ID
- 寄存器组的值
- 线程的堆栈
- 错误返回码
- 线程的信号屏蔽码
所以选择为 BD
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)的调度机制
换页错误又称缺页错误,当一个程序试图访问没有映射到物理内存的地方时,就会出现缺页错误, 这时操作系统就要去虚拟内存中加载这块内存页。
减少换页错误的方法,即降低缺页中断率:
- 内存页框数。增加作业分得的内存块数。
- 页面大小。页面划分越大,中断率越低。
- 替换算法的优劣影响缺页中断次数
- 程序局部性。程序局部性好可减少缺页中断
因此选择 B
21、递归函数最终会结束,那么这个函数一定?()
A. 使用了局部变量
B. 有一个分支不调用自身
C. 使用了全局变量或者使用了一个或多个参数
D. 没有循环调用
递归基础知识,选择 B
22、编译过程中,语法分析器的任务是( )
A. 分析单词是怎样构成的
B. 分析单词串是如何构成语言和说明的
C. 分析语句和说明是如何构成程序的
D. 分析程序的结构
- 词法分析(lexical analysis)
词法分析是编译过程的第一个阶段。这个阶段的任务是从左到右的读取每个字符,然后根据构词规则识别单词。词法分析可以用lex等工具自动生成。
- 语法分析(syntax analysis)
语法分析是编译过程的一个逻辑阶段。语法分析在词法分析的基础上,将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等。语法分析程序判断程序在结构上是否正确。
- 语义分析(semantic analysis)
属于逻辑阶段。对源程序进行上下文有关性质的审查,类型检查。如赋值语句左右端类型匹配问题。
所以 BCD 都属于词法分析,选择结果为 BCD
23、同步机制应该遵循哪些基本准则?(ABCD)
A.空闲让进
B.忙则等待
C.有限等待
D.让权等待
24、进程进入等待状态有哪几种方式?(D)
A. CPU调度给优先级更高的线程
B. 阻塞的线程获得资源或者信号
C. 在时间片轮转的情况下,如果时间片到了
D. 获得spinlock未果
25、设计模式中,属于结构型模式的有哪些?(BC)
A. 状态模式
B. 装饰模式
C. 代理模式
D. 观察者模式