提前批
一面
首先是自我介绍,然后简单问了下项目相关以及实习相关的问,紧接着就是怼题目了,考察基础部分了
- 常用的排序算法有哪些?
// 我说了插入,选择,冒泡,快速排序,堆排序,希尔,归并。。。。
归并排序的时间复杂度?
快速排序的原理?时间复杂度?最坏的情况复杂度?什么时候才是最坏复杂度?
- 最小生成树了解吗?
我说图论的,然后就简单介绍了下概念,关于图论真的了解的少,还有那几种图论算法来着,,,,
- 二分查找怎么实现的?
去平均值比较(口误啊,md!!!)
- 红黑树有了解吗?
我:查找树,红黑树满足的五条性质,以及特征,这样做的好处,不严格平衡,查找效率高,复杂度O(logn)。。。。
红黑树有哪些特征?
我:又在胡扯了。。。
什么叫平衡二叉树?有什么用处?
我: 我怎么知道怎么用????,就这么用
如果节点数一样,为什么二叉平衡树更节省空间?
- 堆排序,最大堆怎么实现的?
我:说了一些概念,然后说不太知道了。。。。
节点的调整?是从下往上还是从上往下?
堆排序就是建立堆,和调整堆的过程,从下往上,堆即完全二叉树,数组存储的的形式满足:根节点,left 2n+1 right 2n+2
- kmp算法了解吗?具体原理能说一下吗?
我说next数组。。。
我巴拉说了几句,不太知道了
- 进程间怎么通信的?
我巴拉巴拉。。。,七种进程间通信简单介绍了一下,各自的特点优缺点,适用场合
是不是漏了什么重要的? 共享内存有了解吗?怎么实现的
我说mmap ,巴拉巴拉。。。。
具体是怎么实现的? 接口,原理?
我说原理不太了解。。。。
- 管道有有名管道和无名管道,他们之间有什么差别呢?
。。。。
管道的优势?
我:我咋知道??? 后头一想,我误解面试官意思了,尴尬。。。。
- 程序运行结构栈结构?
我简单描述了下。。。。
运行程序整体的栈结构是怎么样子的?
我。。。不知道
- 系统分用户空间和内核空间有了解吗?
在Linux里面,对应于用户态和内核态,与权限和特权级有关,在中断,系统调用或者信号才使进程陷入内核态,获得更高的访问级别;32位的Linux系统里面,虚拟内存对应的大小为4G,高位1G对应的是内核空间,低位3G是用户空间。
- 我们那个程序假如发生段错误,这个要怎么去排查呢?
段错误一般与非法访问有关,比如数组下标越界,栈溢出,递归调用层数过多;在Linux里面可以用gdb调试,bt来查看堆栈
附:关于段错误相关具体可以查看这篇博客:C/C++段错误问题排查和解决方案
-
select,poll,epoll三组I/O复用对比,优缺点
ET,LT模式?
附:我之前简单总结了的博客I/O复用之select,poll,epoll (一)
- TCP的拥塞控制有了解吗?讲一下?
附:
TCP的核心就要搞清楚状态机转换过程,那几种算法(nagle,RTT算法,拥塞算法,滑动窗口,序列号)
TCP三次握手过程讲一下?知道SYN分节攻击吗?
附:关于三次握手和四次挥手,这篇博文讲得非常详细了 面试官,不要再问我三次握手和四次挥手
- new 和 malloc区别?
new是C++运算符,关键字;而malloc是C语言库函数
最核心的区别:new由编译器支持,满足对象语义,创建对象和销毁对象会执行构造和析构函数,返回该类型指针;而malloc是库函数,只是向系统申请一块堆内存,无类型,需要进行一个C类型的强制类型转换。
而new实际将malloc封装了起来,解析可分为两个步骤
- C++中的STL容器主要用过哪些呢?在使用map的时候,我们需要分离一个迭代器嘛,这个迭代器++和++迭代器有什么区别?
我说,don‘t konw
- C++的虚函数怎么使用呢?
我从多态开始讲,然后介绍到虚函数的实现,以及虚函数表的结构,具体的调用过程,虚函数的继承关系,以及对象模型
- 现在有一个int指针,其值为假设为100,执行++之后为多少呢?
还问了一些,C语言函数调用的相关问题,一面大概半个多小时就结束了,半个多小时后,收到了二面通知
二面
- 先简单出个算法小题目吧!假如现在有一个输入有两个集合A和B,输出另外一个集合C,输入是一些IP段,IP地址是延续的,并且都是整数,一百万,假设其中只要一个IP地址的值,这个值要么是IP地址要么带有一个IP段。并且在集合中无重复,乱序的,输出的集合C是他们的合并
和面试官讨论了蛮久,说了下思路,我对这题感觉比较陌生,一直都没太听明白意思
- 你做过的一些项目?
我简单介绍了一下,面试官好像不是太感兴趣
-
网络连接的过程?TCP的time_wait状态,为什么客户端要有?有什么作用?分析一下
-
然后问了有了解过云计算和其它开源项目没有?
总之来说,二面不是太顺利,面试官先是推迟了一天,然后这次有迟到了一个多小时,来的好像很匆忙得面试一下,似乎我的简历手头上都没有,然后自我介绍也没有,就是问了这么些问题就没了
结果可想而知,在一个星期后,果不其然得收到了感谢信了
正式批
一面:
-
简单自我介绍
-
说一下#define宏定义?带参数的宏知道吗?比如输入一个或者两个参数之类的,说一下这个的原理,起什么作用?在什么场景下会使用?
-
在做变量运算时,我们会有类型嘛,比如二元运算,我们要遵循一点原则了解吗?
在做不同类型的运算,有了解具体的类型转换规则吗?
-
C语言里面字符串的定义是什么?字符串里面可以包含“\0”吗?
-
strlen和sizeof对比?
-
问一下一个函数有局部变量,全局变量讲一下作用域和生存周期?
如果局部变量加static呢? 全局变量加static呢? -
main函数原型知道吗?main的参数 agrc,argv
-
数据结构排序的算法?
-
递归和循环的实现那种好?
递归有什么缺点呢?为什么开销大呢?
-
快速排序,归并排序,堆排序讲一下,对比,什么时候应该选用哪一种?
-
hashmap哈希表是一个什么样子的吗?
hashmap 函数,key value
核心:1. 快速定址
2. 解决冲突
-
TCP和UDP协议对比,优缺点?
TCP的可靠性体现在哪些方面呢?
什么情况下会不可靠呢?不可靠的情况有哪些?
丢包, 未按序到达,网络拥塞,多次发起连接
- Linux如何创建一个进程?知道进程树吗?开机之后有进程树,为什么会有进程树呢?
二面
- 先做一个简单的自我介绍
- 问实习?
(1)实习期间主要做的什么?有没有参与到项目的开发中来?
(2)并且针对简历上的介绍做了一些问题
(3)实习主要带给你的收获是什么呢?
-
问项目?
(1)介绍一下项目,主要做的事情?
(2)线程池怎么实现的?如何处理同步问题
(3)并发模型采用的什么?
(4)在项目中印象最深刻的问题
(5)什么是CGI服务器? -
有了解过其它什么开源项目吗?主要还看过一些什么书呢?
我简单说了一下,并且提到了muduo网络库
总结:这家企业比较注重基础的考察,对语言,操作系统功底最看重,其次有时真的要看一点运气,是不是能和面试官聊得比较开,我两次二面都不是太顺利,可能是我不太胃口吧