这是第二次来参加腾讯的笔试了,感觉和往年的试题差别不大,考得比较基础,内容也基本集中在C++,数据结构,操作系统部分,计算机网络部分。腾讯的笔试题选择题貌似每年都是不定项选择,熟话说不怕单项,不怕多项,最怕不定项,在不知道怎么做的情况下要想蒙对很不容易啊,据说蒙对的概率是4%,废话不多,直接上题,上面是我做的一些答案,望大牛们批评指正!
一、不定项选择题(共25题,每题4分)
1. 关于二叉树,下面说法正确的是(BC)
A. 对于n个节点的二叉树,其高度为nlog2n;
B. 一个具有1025个节点的二叉树,其高度范围在11~1025之间
C. 二叉树的先序遍历是EFHIGJK,中序遍历为HFIEJKG,该二叉树的右子树的根为G
D. 二叉树中至少有一个节点的度为2
分析:
A. 高度最大为n,最小为log2 n,排除
B. 正确。
C. 二叉树为:
E
F G
H I J
K
D.如果二叉树只有一个根节点,那么度为0,排除
2. 假设函数f1的时间复杂度O(n),那么f1*f1的时间复杂度为(A)
A. O(n)B. O(n*n)C. O(n*log(n))D. 以上都不对
3. 对下列四种排序方法,在排序中关键字比较次数与记录初始化顺序无关的是(B)
A. 直接插入B. 二分法插入C. 快速排序D. 归并排序
分析:此题有待商榷。
4. 已知一段文本有1382个字符,使用了1382个字节存储,这段文本全部是由a、b、c、d、e字符组成,a 354次,b483次,c 227次,d 96次,e 222次,对这5个字符使用哈夫曼编码。则以下说法正确的是?(ACD ?)
A. 使用哈夫曼编码后,使用编码值来存储这段文本将花费最少的存储空间
B. 使用哈夫曼编码后,a,b,c,d,e这5个字符对应的编码值是唯一确定的
C.使用哈夫曼编码后,a,b,c,d,e 这5个字符对应的编码值可以有多套,但每个字符的编码位数是确定的
D. b这个字符的编码位数最短,d这个字符的哈夫曼编码位数应该最长
分析:
可以确定B肯定不对,C肯定对。但是选项A和D说的不是很清楚,我再考试时就很犹豫要不要选这两个,希望大牛们给点意见吧。
5. 判断单链表有没有环的算法中,至少需要几个指针(B)
A. 1 B. 2 C. 3 D. 4
分析:
此题在各大公司的笔试和面试中都出现过,都与本题比较像,建议大家去做一下下面几题:
1. 给定单链表,检测是否有环。
2. 给定两个单链表(head1, head2),检测两个链表是否有交点,如果有返回第一个交点。
3.给定单链表(head),如果有环的话请返回从头结点进入环的第一个节点。
本题的做法是:使用两个指针p1,p2从链表头开始遍历,p1每次前进一步,p2每次前进两步。如果p2到达链表尾部,说明无环,否则p1、p2必然会在某个时刻相遇(p1==p2),从而检测到链表中有环。
6. 在编译过程中,产生Parse tree的过程是(A)
A. 语法分析 B. 语义分析阶段 C. 词法分析D. 目标代码生成阶段
7. 阅读下面代码,程序会打印出来的值是(D)
#include
void f(char **p){
*p += 2;
}
void main() {
char *a[] = {“123”,”abc”,”456”},**p;
p = a;
f(p);
printf(“%s\r\n”,*p);
}
A. 123 B. abc C. 456 D. 3
8. char p1[] = “Tencent”, void p2= malloc((10)在32位机器上sizeof(p1)和sizeof(p2)对应的值是(C)
A. 8:0 B. 4:10 C. 8:4 D. 4:4
分析:在这份试卷中多处考到了sizeof这个运算符,历年的考题中也出现的比较多,因此值得重视。这里简单说明一下sizeof(p),如果p是指针那么就是指针的储存的长度,在32位机上就是4个字节;如果是数组,那么就是数组存储的长度,也就是数组长度乘以单个元素存储字节。
9. 现在有以下两个函数,调用test的结果是(D?)
char* getMem(void) {
char p[] = “hello world ”;
p[5] = 0x0;
return p;
}
void test(void) {
char *s = 0x0;
s = getMem();
printf(s);
}
A. hello B. 无输出 C. Hello0world D. 不确定
分析:
此题在我考试时选的是A,回来测试了一下输出结果却是不确定的,对此我比较疑惑,哎,我的C++并不好,望大神给点指示。
10. 冯诺依曼体系结构计算机的基本原理是(D)
A信息存储 B 存储智能 C 数字控制 D 存储程序和程序控制
11.下面代码中析构函数(1)和(2)的调用顺序是(C)
class base{
public:
~base(){} //(1)
};
class child:public base{
public:
~child(){} //(2)
};
int main(){
base *b = new child();
delete b;
}
A. 先调用(1)再调用(2) B.先调用(2)再调用(1)
C.只调用(1) D.只调用(2)
分析:
注意本题中的析构函数并不是虚函数,所以只会调用变量本身类型的析构函数,也就是只会调用(1).如果是虚析构函数,则会先调用(2)再调用(1)。
12.下面哪种设计模式的定义为:定义对象间的一种一对多的关系,当一个对象改变时,其他依赖于他的对象都能够得到通知并自动更新。(C)
A. VisitorB. Adapter C. Observer D. Interpreter
分析:
建议大家看一下常用的设计模式,在笔试和面试中经常遇到。比如常用的设计模式:单例模式、工厂模式(抽象工厂模式)、观察者模式、适配器模式、迭代模式等等。本题选择C观察者模式。
13.请看一下这一段C++代码,如果编译后程序在windows下运行,则一下说话正确的是(C)
char*p1 =“123456”;
char*p2 =(char*)malloc(10);
A. p1和p2都存在栈中
B. p2指向的10个字节内存在栈中
C. 堆和栈在内存中的生长方向是相反的
D. “123456”这6个字符存储在栈中
分析:
A. p1和p2如果放在函数体外,则存在全局区,如果在函数体内则存在栈中。
B. p2指向的10个字节内存在堆中。
C. 正确。
D. “123456”这6个字符存储在常量区。
14.将3个球随机放入4个杯子中,则杯子中球的最大个数为2的概率是(A)
A. 9/16 B. 3/4C. 3/8 D. 3/16
分析:
要求杯子中球的最大个数为2,也就是四个杯子中的球数目为2,1,0,0.所求概率是古典概型,总的事件为4^3,符合条件的总数为
C(2,3)*C(1,4)*C(1,3),所以P=C(2,3)*C(1,4)*C(1,3)/4^3 = 9/16.
15.对n个元素的数组进行快速排序,所需要的额外空间为(A)
A. O(1)B. O(n)C. O(log(2n))D. O(n^2)
16.下面关于编译器与解释器的观点,错误的是(D?)
A. 解释器不产生目标程序,它直接执行源程序或者源程序的内部形式
B. 解释程序和编译程序的主要区别在于是否产生目标程序
C. 编译器对高级语言程序的处理过程划分成词法分析、语法分析、语义分析,中间代码生成、代码优化、目标代码生成几个阶段
D. 解释器参与运行控制、程序执行的速度快
分析:有关于解释器和编译器的区别大家可以看下面这个链接,讲得还是比较详细的:http://blog.csdn.net/touzani/article/details/1625760
17.假设系统中有5太设备,有多个进程需要使用2个设备,假定每个进程一次只能使用一台,则至多允许多少个进程来竞争这5个资源,而不会发生死锁(C)
A. 2 B. 3 C. 4D. 5
分析:
此题虽然在考试时选了C,但是并没有把握,后然上网查了一下,确定应该就是C了。其实这题就是哲学家就餐问题,当5哥进程的时候如果同时申请到了1台,就会发生死锁;如果是4个进程,那必然有一个能申请到2台。
18.下面哪些协议,存在源端口和目的端口是(BC)
A. IP B. TCP C. UDP D. ICMP协议
分析:源端口和目的端口是在传输层中用到的因此选BC。
19.下列哪些sql是等价的(AD?)
A. selectA.tname,A.depart from teacher A join course B on B.tno =A.tno
B. selectA.tname,A.depart from teacher A where A.tno=course.tno
C. selectA.tname,A.depart from teacher where tno in (select tno from course)
D. selectA.tname,A.depart from teacher where exsist (select * from course B where B.tno= A.tno);
分析:数据库的SQL语句忘得差不多了,这个题也是蒙的。
20.某一磁盘请求序列(磁道号):98、 183、37、122、14、124、 65、 67,按照先来先服务FCFS磁盘调度对磁盘进行请求服务,假设当前磁头在53道上,则磁臂总移动道数为:(C)
A、169 B、208 C、640 D、236
21.将一个C类网络划分为3个子网,每个子网最少要容纳55台主机,使用的子网掩码是:(D)
A、255.255.255.248 B、255.255.255.224
C、255.255.255.224 D、255.255.255. 192
22下列关于计算机硬件的描述,正确的是:(D)
A、磁盘的平均存取时间指的是磁盘的寻道时间加上磁头在某一磁道等待记录扇区的时间
B、计算机的控制器是由多种部件组成,其中包括,指令寄存器、程序计数器和算数逻辑单元
C、一台计算机的字长是32位,表明该机器能处理的数值最多为4个字节
D、系统总线可以分为数据总线、地址总线和控制总线三类
分析:
好吧,这题在考试时做错了(多选了一个B)。后来上网查了一下计算器控制器的组成:指令寄存器InstructionRegister、指令译码器InstructionDecoder、定时与控制电路ProgrammableLogic Array、程序计数器ProgramCounter、标志寄存器FlagsRegister、堆栈和堆栈指针Stack Pointer、寄存器组等构成。
23、假设有关系模式R(A,B,C,D),其数据依赖集:F={(A,B)->C,C->D},则关系模式R的规范化程度最高达到:(B) A.1NF B.2NF C.3NF D.BCNF
分析:
这个题考试时算是半猜半蒙的,回来翻了一下书看了一下关系模式的定义,应该选B。2NF:第二范式。如果关系模式R为第一范式,并且R中每一个非主属性完全函数依赖于R的某个候选键,则称R为第二范式模式。(如果A是关系模式R的候选键的一个属性,则称A是R的主属性,否则称A是R的非主属性。) 3NF:第三范式。如果关系模式R是第二范式,且每个非主属性都不传递依赖于R的候选键,则称R是第三范式的模式。BCNF:BC模式。如果关系模式R是第一范式,且每个属性都不传递依赖于R的候选键,那么称R为BCNF的模式。
24.以下为一段浏览器中可运行的Javascript 代码,则运行该段Javascript代码的页面弹出框中显示的结果是:(D?)
var obj = {“key”:”1”,”value”:2}; var objNew = obj; objNew.value +=obj.key; alert(obj.value);
A、2 B、12 C、3 D、21
分析:本人对javascript不怎么熟悉,因此这个题的答案不确定对不对。
25.有足够量的2分、5分、1分硬币,如果想凑齐一元钱,可以有(A)种方法 A、541 B、270 C、1024 D、128
分析:
设1分的硬币有x,2分的硬币有y,5分的硬币有z。那么x+2y+5z = 100,问题转化为这个三元一次方程有多少整数解。下面给一种不规范的解法:
当z = 20, x = 0, 1个解
当z = 19, x = 1,3,5, 3个解
当z =18,x = 0,2,4,6,8,10, 6个解
当z = 17,x = 1,3,5,7,9,11,13,15, 11个解
…..
当z = 1,x = 1,3,5,7,…,95, 48个解
当z = 1, x = 0,2,4,6,….100, 51个解
可以发现每一行解个数类似一个等差数列,因此可以做等差数列求和来近似求解,(1+51)*21 / 2 = 546与选项中541比较接近所以选A,我在考试的时候就是用的这种方法,其他的求和没有仔细想过,大家可以回去想想吧。
二、填空题(共5题,每题4分,共20分)
26、阅读下面代码: #defineMAX_NUM 1000+1
int Temp =Max_NUM*10;
则Temp的值为( 1010)
分析:
注意宏定义只是字符串的替代,是在编译之前完成的,在本题中替代后的代码为:int Temp =1000+1*10;因此编译执行的时候结果是1010.这点提醒我们在使用宏定义的时候加适当的括号很有必要。
27.某个单CPU操作系统抢占式进程调度策略。现在有三个任务T1(优先级高),T2(优先级中),T3(优先级低)同时进入调度队列,每个任务都需要占用CPU时间10ms, 等待I/O需要13ms,然后再用CPU时间5ms,则T3从进入调度对了到完成需要(54)ms(不考虑系统任务调度的开销)
分析:
注意三个任务是同事进入调度队列的!
调度过程顺序如下:
1.CPU调用T1,执行10ms.
2.I/O处理T1 10ms,CPU同时调度T2,执行10ms
3.I/O处理T1 3ms,CPU同时调度T3,执行3ms
4.CPU调用T1 5ms,I/O处理T2 5ms,T1完成任务
5.I/O处理T2 7ms,CPU同时调度T3,执行7ms
6.I/O处理T2 1ms
7.CPU调用T2 5ms,I/O处理T3,执行5ms,T2完成任务
8.I/O处理T3 8ms
9.CPU调度T3执行5ms
总时间为10+10+3+5+7+1+5+8+5 = 54ms
28.在一个采用页式虚拟存储管理的系统中,有一用户作业,它依次要访问的也没序列是1,2,3,4,1,2,5,1,2,3,4,5.假定分配给该作业的页数为3且作业初始时未装载页面,那么采用FIFO调度算法产生的缺页中断数为(9),采用LRU调度算法产生的缺页中断数为(10)
分析:
FIFO:
1.前三个作业,都发生缺页,队列:1,2,3
2.作业4进来,1被替换,缺页,队列:2,3,4
3.作业1进来,2被替换,缺页,队列:3,4,1
4.作业2进来,3被替换,缺页,队列:4,1,2
5.作业5进来,4被替换,缺页,队列:1,2,5
6.作业1进来,没有缺页,队列:1,2,5
7.作业2进来,没有缺页,队列:1,2,5
8.作业3进来,1被替换,缺页,队列:2,5,3
9.作业4进来,2被替换,缺页,队列:5,3,4
10.作业5进来,没有缺页,队列:5,3,4
共发生缺页9次。
LRU:
1.前三个作业,都发生缺页,队列:1,2,3
2.作业4进来,1被替换,缺页,队列:2,3,4
3.作业1进来,2被替换,缺页,队列:3,4,1
4.作业2进来,3被替换,缺页,队列:4,1,2
5.作业5进来,4被替换,缺页,队列:1,2,5
6.作业1进来,没有缺页,队列:2,5,1
7.作业2进来,没有缺页,队列:5,1,2
8.作业3进来,5被替换,缺页,队列:1,2,3
9.作业4进来,1被替换,缺页,队列:2,3,4
10.作业5进来,2被替换,缺页,队列:3,4,5
共发生缺页10次。
29.#include <stdio.h>
class Base
{
public:
virtual int foo(int x){return x*10;}
int foo(char x[14]){returnsizeof(x)+10;}
};
classDerived:public Base
{
int foo(int x){return x*20;}
virtual int foo(char x[10]){return sizeof(x)+20;}
};
int main(void)
{
Derived stDerived;
Base * pstBase=& stDerived;
char x[10];
printf(“%d\n”,pstBase->foo(100)+pstBase->foo(x));
return 0;
}
在32位环境下,以上程序的输出结果是(2014)
分析:
对于虚函数与多态,调用基类方法还是子类方法,我常用的方法是,
虚函数调用看右边,非虚函数调用看左边。在本题中foo(100)是虚函数(在基类中该方法名前有关键字virtual,在子类中只是省略了),所以看右边,右边是Derived类型,因此调用基类的子类。
foo(x)是非虚函数(基类该方法名前没有virtual,所以不是虚函数),看左边类型是Base类型,因此调用子类foo。
另外在本题中还需要注意一点,在执行int foo(charx[14]){return sizeof(x)+10;}时,x其实不是数组类型,而是已经转换为指针类型,因此sizeof(x)的结果是4.
题目答案为2014,貌似当时自己也做错了~~~~。
附加题(共2题,不计入总分)
31.珠宝商甲需要去鉴定一批41克以下的宝石(可能是41克以下不包括41克的任意重量),他只能携带一个天平和四个砝码去称重,请问他会携带那些重量的砝码?
分析:
标准答案是:1,3,9,27。我当时做的答案是:1,4,9,25,说明一下,如果需要称量2克,需要2次,首先称出比1克重,再称出比3克轻,因为是整数克,所以就确定是2克,其余的大家推一下,我推的时候是可以的,大伙看看我的答案对不对。
32.UTF-8是现在流行的编码方式,下面是RFC2279对UTF-8编码规则的规定,根据这个规则,中文字符‘我’的unicode值为0X6211,utf-8编码之后为0XE68891。 请回答一下问题:
A)英文字符‘a’,其unicode的十六进制值为0X61,则其UTF-8编码后的十六进制值为?
B)中文字符‘腾’,其unicode的十六进制值为0X817E,则其UTF-8编码后的十六进制值为?
C)中文字符‘讯’,其unicode值经过UTF-8编码之后为0XE8AEAF,则请问其unicode的十六进制值是?
分析:
这里对UTF-8的编码不做介绍了,有兴趣的同学可以上网找找资料,有好多关于UTF-8的资料。
答案是:A)0X61 B)0XE885BE C)0X8BAF