一面主要问了很多基础知识
1.自我介绍
2.大学做过的项目(具体点)
3.项目中主要用到的技术
4.说下你知道的排序算法,并说出他们的复杂度(说了6个 冒泡,插入,选择,快排,堆排,归并)
5.二叉树的遍历方式(四种)
6.说下你对递归,动态规划,回溯的理解
7.说下二分查找
8.如何判断两个链表是否相交?
9.AVL树,红黑树,B树的区别
来点计算机网络
9.讲下TCP的三次握手
10.讲下浏览器从输入url之后的整个过程,越具体越好
11.讲下TCP的拥塞阻塞的方式(慢启动,拥塞避免,快重传,快恢复),具体展开讲
12.TCP的七层模型,然后问数据段在那一层,加密解密在哪一层?
13.TCP滑动窗口原理
14.看你简历上写了解设计模式,说下你知道的设计模式(单例,模板,工厂,迭代器,适配器)
15.具体说下单例的实现(昨天头条刚面过这题的手写)
16.进程与线程区别
17.线程间的通信(具体讲每一种是什么意思)
18.网络IO编程模型(同步,异步,阻塞,非阻塞IO)
19.最后是一道算法题:说必考一道两道编程题
20.最长回文串思路(佳鹏哥那题没想到一面就遇到了,幸好只是说思路,不然写代码又得花很长时间)
总结:一面主要问的都是基础问题
2面
1.首先是两道编程题,另外第一题的话要求给出非递归的版本(一面刚好遇到回文串的问题,刚好用上了,昨天头条面到了完全二叉树的思路刚好可以用上。)
2.苹果树
一开始说了一个最简单的写法,就是创建一个结果数组res[b.size()];
然后for(int i = 0; i < m ; i++){
for(int j = 0 ; j < a.size() ; j ++){
if(a[j] < b[i]){
res[i] = res[i] + a[j];
a[j] = 0;
}else{
res[i] = res[i] + b[i];
a[j] = a[j] - b[i];
}
}
}
接下来面试官问有没有数据结构能够做这个题目,想了几分钟,面试官说下一题,我说是不是堆,然后他说回头你自己向下,最后我反问的时候又重新说了下那个题目可以优化的地方在于不要继续算0
3.你觉得自己笔试成绩怎么样
4.问点语言基础把
5.谈谈你心目中的C++(把C给痛打一顿之后,开始吹捧C++)
6.指针和引用的区别
7.四种类型转换
8.再来一道题目,讲前缀树怎么实现
9.聊下你的学习情况,课余时间外有没有主动去接触一些知识
10. 你简历中有写用到多线程,你能说下线程池的实现吗?(卧槽,怎么还有题目....)
11.具体说下你研究生的项目把
12.反问:一道题一般思考多长时间比较合适?那边主要做什么的?
总结:二面主要问的是算法题,C++基础,工程应用
三面:
以为凉了,二面面试官没说有下一轮,隔了一会儿牛客网状态变了,说有三面。
1.自我介绍
2.在哪个平台开发?Linux平台
平时怎么调试程序的?
2.来做一道题目把,有两个有序数组,怎么去找到他们俩的交集
我:首先遍历第一个数组,然后建立一个哈希表,接下来遍历第二个数组,查看哈希表中是否存在这个数。
面试官:嗯嗯,那你分析下时间复杂度。
我:遍历一次数组o(n1),建立一个哈希表o(n1),然后遍历第二个数组o(n2),所以时间复杂度o(n1+n2),空间为o(n1);
面试官:嗯嗯,那能不能利用它的有序特性呢?
我:我想下(几分钟后),继续是有序,那么可以考虑二分,对于第一个数组中的每个数,我们都会它在第二个数组中进行二分查找,然后如果存在就加到有序数组中
面试官:你分析下这个的时间复杂度以及空间
我:遍历第一个数组的每个数在第二个数组二分,所以时间复杂度是O(n1 * Log(n2)),空间复杂度为O(1)
面试官:能不能再优化一下
我:我想下(几分钟后),对于第一个数组中的第一个数字,我们进行二分,我们假设一种简单情况,就假设能够再第二个数组中找到那个元素,记为p2
接下来,对于第一个数组中指针每次移动一个,第二个数组如果小于,就往右移......(越说越乱)
面试官:那你分析下复杂度
我:O(n1+n2),空间为O(1)
捏了一把汉,终于挺过这个题目了。
3.面试官:我们再来看一个题目把,就是有海量的URL,如何对他们进行去重?
我:(心里想着GG,大数据方面没看过啊.......)然后就说了用hashmap存储遇到的url,如果遇到重复的就不加进去。然后说不知道海量和正常数据有什么区别?感觉都可以这样处理把。
面试官:海量的话,你单台机子装不下去。
我:(直到写面经的时候,我才发现我原来理解错题意了,面试官的意思估计是说单个机子内存放不下,我他妈以为是硬盘装不下去.....)我说hash到不同机子去查表
4.智能指针知道吗?说一下每种指针的应用场景是什么?
独占unique_ptr用于只能由一个对象的时候,比如cout,打印机等资源
共享shared_ptr用于共享对象,能够减少内存的消耗
弱指针weak_ptr主要用于解决共享指针导致的循环引,导致释放的时候出现内存谢列
5.讲下线程的同步方法
6.再做一道题目把,重建二叉树的题目(只需要说出思路)
7.场景题:App的活跃用户峰值(需求说的非常模糊),你完全不知道你有什么数据可以用。然后问有没有什么可以用的数据,后面用扯到了说是实时的数据流,最后问题压缩到如何判断当前时间(精确到秒)有多少个用户活跃?(说了应该得看服务器端有多少个TCP连接了).
8.刚才那道重建二叉树得题目,给出你做测试得方案。
9.具体讲下你研究生的这个项目是怎么做的?
10.数据库了解吗?不了解XXX
11.网络编程了解吗?最近刚开始看xxx
12.Linux输出第二列的全部内容? 不会....知道这个是linux文本操作的内容,但还没复习到,然后就平时用到的一些Linux指令
10.能够实习多久?xxx
11.反问环节。哪个部门,主要工作,对自己的表现给点建议。
总结:算法+场景题+基础
许愿OC