腾讯2017校招开发工程师笔试试卷(一)答题解析

1.参数传递是通过栈实现的,从右向左依次压栈。

2.具有3个节点的二叉树有几种形态?答案为:5。n个结点的二叉树的形态:(2*n,n)/n+1

3.已知一棵二叉树的前序遍历为CABEFDHG,中序遍历为BAFECHDG,那么它的后续遍历是:(BFEAHGDC)

4.哪种数据结构用于执行递归调用?答:堆栈。

5.在Linux上,对于多进程,子进程继承了父进程的下列哪些?

答:

  • 子进程继承父进程
    • 用户号UIDs和用户组号GIDs
    • 环境Environment
    • 堆栈
    • 共享内存
    • 打开文件的描述符
    • 执行时关闭(Close-on-exec)标志
    • 信号(Signal)控制设定
    • 进程组号
    • 当前工作目录
    • 根目录
    • 文件方式创建屏蔽字
    • 资源限制
    • 控制终端
  • 子进程独有

    • 进程号PID
    • 不同的父进程号
    • 自己的文件描述符和目录流的拷贝
    • 子进程不继承父进程的进程正文(text),数据和其他锁定内存(memory locks)
    • 不继承异步输入和输出
  • 父进程和子进程拥有独立的地址空间和PID参数。

  • 子进程从父进程继承了用户号和用户组号,用户信息,目录信息,环境(表),打开的文件描述符,堆栈,(共享)内存等。
  • 经过fork()以后,父进程和子进程拥有相同内容的代码段、数据段和用户堆栈,就像父进程把自己克隆了一遍。事实上,父进程只复制了自己的PCB块。而代码段,数据段和用户堆栈内存空间并没有复制一份,而是与子进程共享。只有当子进程在运行中出现写操作时,才会产生中断,并为子进程分配内存空间。由于父进程的PCB和子进程的一样,所以在PCB中断中所记录的父进程占有的资源,也是与子进程共享使用的。这里的“共享”一词意味着“竞争” 。

 

6.若磁头的当前位置在第100磁道,现在有一磁盘读写请求序列如下:23,376,205,132,19,61,190,398,29,4,18,40。若采用最短寻道时间优先算法,则平均寻道长度是多少?

答:

先排序
4.18.19.23.   29.40.61.132.   190.205.376.398
然后分别计算相邻之间的大小关系。寻道较短时间的进行排序
得到
100 132 190 205     61 40 29 23      19 18 4 376      398
然后求出递增和递减临界点
100 205 4 398
计算相邻之差和
105 + 201 + 394 = 700
最后求平均值:700/12 = 58.3
 
7.文件系统管理的最小磁盘空间单位是:簇
 
8.子网掩码和IP地址是配合一起的,将IP地址分成两段,网络段和主机段。

B类地址中,后16位为主机地址,255.255.0.0,二进制为11111111 11111111 00000000 00000000

要想切割成10个子网,至少要向主机位借4位,2^4=16>10

则子网掩码设置成20位,即二进制为 11111111 11111111 11110000 00000000,再换算成十进制之后为:255.255.240.0

参考链接:5分钟带你搞懂子网掩码

9.A.栈空的情况下出栈属于下溢出;B.栈可以顺序存储,也可以是链式存储的线性结构;C.元素为0和无元素是两个不同的概念,当有n个元素为0的栈,拥有n个元素;

10.以下代码打印的是(假设运行在64位计算机上)

struct st_t {
    int status;
    short *pdata;
    char errstr[32];
};
st_t st[16];
char *p=(char *)(st[2].esstr+32);
printf(“%d”,(p-(char *)(st)));

根据字节对齐,在64位系统下struct st_t 结构体占用的字节为48个。
struct st_t {
int status;  //占用8个(后面的4个为对齐位)
short *pdata;//占用8个
char errstr[32];//占用32个
};
char *p=(char *)(st[2].esstr+32),p实际指向了st[3]
则p-(char *)(st)),即为&st[3]-&st[0],占用空间为3个结构体的大小,即3*48=144

11.路由汇聚:

        是把一组路由汇聚为一个单个的路由广播。路由汇聚的最终结果和最明显的好处是缩小网络上的路由表的尺寸。

假设下面有4个网络:
172.18.129.0/24
172.18.130.0/24
172.18.132.0/24
172.18.133.0/24
如果这四个进行路由汇聚,能覆盖这四个网络的汇总地址是:
172.18.128.0/21
算法为:129的二进制代码是10000001
130的二进制代码是10000010
132的二进制代码是10000100
133的二进制代码是10000101
这四个数的前五位相同都是10000,所以加上前面的172.18这两部分相同的位数,网络号就是8+8+5=21。而10000000的十进制数是128,所以,路由汇聚的Ip地址就是172.18.128.0。所以最终答案就是172.18.128.0/21。
 

12.DNS就是将域名翻译成IP地址,DNS协议大多数运行在UDP协议之上,但是当请求字节过长超过512字节时用TCP协议,将其分割成多个片段传输。DNS协议默认端口号是53,

操作系统的DNS缓存:windows DNS缓存的默认值是 MaxCacheTTL,它的默认值是86400s,也就是一天。macOS 严格遵循DNS协议中的TTL。
游览器的DNS缓存:chrome对每个域名会默认缓存60s;IE将DNS缓存30min;Firefox默认缓存时间只有1分钟;Safari约为10S。
 
13.操作系统的调度逻辑是:发生中断->处理调度->发生中断->处理调度,一个时间片长度就是两次中断发生之间的间隔。因此,系统开销比率 = 调度耗时/时间片长度
 

14.C++ 条件运算符 ? :

Exp1 ? Exp2 : Exp3;

其中,Exp1、Exp2 和 Exp3 是表达式。请注意冒号的使用和位置。? : 表达式的值取决于 Exp1 的计算结果。如果 Exp1 为真,则计算 Exp2 的值,且 Exp2 的计算结果则为整个 ? : 表达式的值。如果 Exp1 为假,则计算 Exp3 的值,且 Exp3 的计算结果则为整个 ? : 表达式的值。

15.

C++中 的虚函数的作用主要是实现了多态的机制。而虚函数是通过虚函数表(V-Table)实现的。
构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。
 
构造函数为什么不能声明为虚函数?
1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象的实际类型,是该类本身,还是该类的一个派生类,或是更深层次的派生类。无法确定。 
2 虚函数的执行依赖于虚函数表。而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数表。而在构造对象期间,虚函数表还没有被初 始化,将无法进行。 析构函数执行时先调用派生类的析构函数,其次才调用基类的析构函数。
 
析构函数为什么声明为虚函数?
如果析构函数不是虚函数,而程序执行时又要通过基类的指针去销毁派生类的动态对象,那么用delete销毁对象时,只调用了基类的析构函数,未调用派生类的析构函数。这样会造成销毁对象不完全。
 
包含至少一个纯虚函数的类视为抽象类。
 

16.如果基类的析构函数是虚函数,delete基类的指针时,不仅会调用基类的析构函数,还会调用派生类的析构函数。

而调用的顺序是先调用派生类的析构函数、然后调用基类的析构函数。
 
17.
值类型与引用类型区别:
 

值类型

引用类型

存储方式

直接存储数据本身

存储的是数据的引用,数据存储在数据堆中

内存分配

分配在栈中的

分配在堆中

效率

效率高,不需要地址转换

效率较低,需要进行地址转换

内存回收

使用完后立即回收

使用完后不立即回收,而是交给GC处理回收

赋值操作

创建一个新对象

创建一个引用

类型扩展

不易扩展,所有值类型都是密封(seal)的,所以无法派生出新的值类型

具有多态的特性方便扩展

实例分配

通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中

总是在进程堆中分配(动态分配)

18.内存对齐的3大规则:

  1. 对于结构体的各个成员,第一个成员的偏移量是0,排列在后面的成员其当前偏移量必须是当前成员类型的整数倍
  2. 结构体内所有数据成员各自内存对齐后,结构体本身还要进行一次内存对齐,保证整个结构体占用内存大小是结构体内最大数据成员的最小整数倍
  3. 如程序中有#pragma pack(n)预编译指令,则所有成员对齐以n字节为准(即偏移量是n的整数倍),不再考虑当前类型以及最大结构体内类型

19.小明想自己做一个简单的网上商店,请帮他设计一个最简单的数据库系统,需要具备管理商品、管理客户及订单等功能。

答案:

设计商品表,客户表和订单表。

商品表记录商品信息:如商品id号(主键),名称,类别,类别编码,库存,入库时间,单价;

客户表记录客户信息:如客户id号(主键),用户名,密码MD5值,电话,邮箱,地址, 信用评分;

订单表记录订单信息:如订单id号(主键),客户id号(外键),商品id号(外键),商品数量,折扣,成交价格,成交时间;

 

主键

外键

索引

定义:

唯一标识一条记录,不能有重复的,不允许为空

表的外键是另一表的主键, 外键可以有重复的, 可以是空值

该字段没有重复值,但可以有一个空值

作用:

用来保证数据完整性

用来和其他表建立联系用的

是提高查询排序的速度

个数:

主键只能有一个

一个表可以有多个外键

一个表可以有多个惟一索引

原文地址:https://www.cnblogs.com/zkfopen/p/10656568.html