电话一面是上周五。晚上8点左右,周三,图书馆自习,收到腾讯电话,面试官是企鹅电竞部门,说简单来个10分钟电面。面试基本上是说到哪问哪。以下是面试题目,顺序不分先后,供需要的同学参考下,参考答案有误请及时指出。
1. 构造函数可以是虚函数吗?
不可以。原因有两点:
- 构造对象的时候,必须知道对象的实际类型。而虚函数行为是在运行期间确定实际类型的,在构造对象的时,对象还没有构造成功,编译器无法知道对象的实际类型是该类本身还是其派生类。
- 虚函数的运行依赖于虚函数指针,而虚函数指针在构造函数中进程初始化,让它指向正确的虚函数表,而在对象构造期间,虚函数指针还未构造完成。
2. 网络字节序是大端序还是小端序?
大端序。
3. Linux中如何创建进程以及创建进程后如何区分子进程?
使用fork()调用创建子进程,fork()调用返回两个值,大于0的表示父进程,等于0的表示子进程。
4. fork创建的子进程继承了父进程哪些内容
子进程继承了父进程的地址空间,打开的文件描述符等。
5. fork创建的子进程继承了父进程打开的文件描述符,如何让这种继承不发生
可以在打开文件的时候,设置FD_CLOSEXEC标志位,如果文件描述符中这个标志位置位,那么调用exec时会自动关闭对应的文件。
6. c++虚函数原理
虚函数是依赖于虚函数指针实现,每个拥有虚函数的类都有一个虚表,类的对象存在一个虚函数指针,指向实际类型的虚表。虚函数运行的时候,会根据虚函数指针找到正确的虚表,从而执行正确的虚函数。
7. c++多态的实现
多态分为两种,一种是运行时的多态,一种是编译时的多态。前者称为动态绑定,后者称为静态绑定。动态绑定时由虚函数来实现,静态绑定是由函数重载来实现。
8. c++ vector和list的区别?
vector是动态数组,会动态进行分配内存,进行扩容操作。
list是双向链表。
9. 访问vector的迭代器的时候可以删减元素吗?list呢
任何对vector的修改都将导致vector的迭代器失效。
list因为是双向链表,所以不会失效。
10. c++ vector的底层实现原理
vector底层是基于动态数组实现。
12. c++ map的底层实现
map的底层实现是基于红黑树的。
11. 红黑树的特点以及常见的二叉平衡树
红黑树性能比较高,插入删除时间复杂度保持在logn。和AVL相比,要求不是那么严格,它只要求到叶节点的最长路径不超过最短路径的两倍。相比之下,AVL要求左右子树相差高度不超过一,简单的插入或者删除都会导致树的不平衡需要旋转操作。
(我只说这么多,后来的同学建议说下红黑树的五个特点)
11. c++空类的sizeof大小
c++空类的大小为1,如果含有虚函数的话,大小为指针的大小。32位系统指针大小是4。
c++要求即使是空类,对象也要有存储空间。含有虚函数的空类则是因为对象由虚函数指针。
13. 快速排序的时间复杂度
快速排序平均时间复杂度位nlogn,最差O(n^2)
14. nLogn是排序最好的时间复杂度吗?
不是,还有O(n)的算法,比如说基数排序。
15. 基数排序的原理以及应用
基数排序根据一个数的高低位进行排序。应用不知道,缺点是对负数的处理不太好。
16. 介绍负载均衡的应用
不知道。
17. http协议有用过吗?
这个没用过。
18. protobuf协议
我们公司之前使用的是json协议,没有用过protobuf协议。
19. 数据库
没用过。
20. redis
这个是自己学习使用的,生产环境没用过(这里说了下,我用它干嘛的,使用python的flask web框架基于redis的list结构开发一个网络聊天程序)
21. 解释线程安全和可重入函数
这个是关于多线程访问的吗?可重入函数这个名词听过,但是忘记干啥了,面试官说pass.
(一个可重入函数被称为可重入的,表明该函数被重入之后,不会产生任何不良后果,一个函数被重入,表示这个函数没有执行完成,由于内部原因或外部原因调用,又一次进入该函数执行)
22. top的命令cache和buffer区别
这个平常没有关注过。
(buffer是块设备的读写缓冲区,比如磁盘,cache是文件系统的缓存,常用于文件)
23. 常见Linux命令是否用过,比如strace和netstat
这个有用过,strace用来跟踪程序的执行,top查看内存,以及tcpdump等进行抓包等等。
24. 多个动态库的连接顺序有区别吗,顺序怎么排
有顺序的,如果顺序错误的话可能导致编译失败。这里的编译顺序应该是被依赖的库放在后面。
(这个我之前工作中遇到这个坑,所以知道。不过当时面试的时候,把顺序忘了)
25. 智力题,100本书,两个人轮流拿,每次拿1~5本,你先拿,有没有啥策略可以保证你可以拿到最后一本?
这个我承认,智力题不是我的强项,每次遇到的话都要N天才思考明白( ̄_ ̄|||),当时考虑了大概30秒,想着100本这么多,要不先来10本试试,我一本,他一本,我一本.......挣扎了几秒,老实承认,没想到啥好方法。
(此题解法可以是先手拿4本,后续双方每次拿6的倍数,这样可以保证最终可以拿到最后一本)。
通过上述题目可以看出,腾讯考察范围还是相当广的,包括操作系统、计算机网络、算法与数据结构、编程语言,数据库等等。对于软件工程的全面性要求比较高。面试前一定要做好充足准备。然后祝大家一切顺利,拿到自己心仪的offer。