有同学私信我要面经分享,这里就简单分享一下我的一二面情况(已OC但最终因为个人原因没有去)。
我的运气很不错,两面的面试官都没有怎么刁难我。
一面:coding
1.简单地自我介绍+介绍一个曾经做过的项目
2.算法题一:二叉树的层次遍历,每一层作为一个集合输出(很简单,直接队列过了)
面试官问了时间复杂度和空间复杂度,我说都是O(n)。
答空间复杂度时,说了O(n)但多嘴提到队列里面最多只存二层的节点。然后面试官就追问那么对于一个n个节点的树,一层最多有多少个节点。当时面试很慌张竟一时不知道咋搞,花了比较长时间推出大概是n/2。面试官又问那空间复杂度是多少,自己因为太紧张竟然被诱导说是O(n/2),真是太可笑了。好在面试官比较友善,后面就没有那么紧张了。
总之,大家千万别多嘴,特别是很紧张的情况下,你都不知道会犯多么幼稚的错误。
3.算法题二:二叉树的”垂直”遍历(以前没有见过,感觉是临时编的)
给定一棵二叉时,记其根节点的等级为0,往左走一步等级-1,往右走一步等级+1,依次类推为每个节点标记等级。
最终输出:将相同等级的所有节点放在一个集合中,按照等级顺序依次输出所有集合,每个集合中节点的顺序就按照从上往下,从左往右的顺序输出(如果树的高度小于等于3时,看上去像是在垂直遍历)。
当时画了张图,发现相同等级的节点在树中的位置好像比较乱,没有什么明显的规律,所以就想着怎么简单怎么来。
其实该题本质上就是层次遍历,只是在维护队列的同时要进行等级的计算。计算得到某个节点的等级时,通过map将该节点的值存储到key=等级值的空间中即可。
这里还有个小插曲,因为一般想到的二叉树长得都比较正常,所有我想着从根节点出发一直往左遍历就能找到最小等级,一直往右遍历就能找到最大等级,这样我们就可以直接预先创建出所有等级值的map。当时面试官也认为这种想法是对的,但现在仔细想想其实是错的,从根点出发一直向左/向右其实不能保证找到的等级是最小/最大的。
面试官默认上述思路是正确的,所以后来还问我能不能将map改成vector存储。我说可以,因为知道最小最大值了,就可以将其映射到自然数范围。面试官又问我为什么换成vector更好。我当时回答map以hash实现访问也是O(1),好像也不用换。面试官回答说考虑底层实现,vector其实更快。
这里也可以看到,面试官其实也不一定能想到特例,算法题有思路大胆讲就好,细节有问题/有小错并不要紧。
面试顺利结束,面试官说我回答的算很好了
二面:coding+基础
1.简单地自我介绍
2.算法题:Leetcode HOT100 152.乘积最大子数组
很久之前做过,推dp稍微花了些时间,最后实现有小错误,但因为面试时没有测试,思路对了面试官就没细看代码
3.项目经历:感觉虽然我的研究方向有点小偏,但面试官还是认真听了,问的蛮细的,建议项目还是要深挖一下
4.基础考察:面试官说是一定要走的流程,但个人没很细地准备
深度学习
(1)强化学习了解吗:有了解但研究生阶段没咋接触(那就不问了)
(2)优化器知道哪些,简单介绍:讲了SGD和Adam
追问:那么Adam和SGD的区别在哪?Adam有什么创新点?
之前稍微了解过,就简单讲了Adam会为每个参数单独计算学习率,然后会考虑之前所计算得到的梯度对等,然后还回答了自己实践的一些经验。
(3)常见的分类算法有哪些?我说有逻辑回归、SVM等
(4)挑一个上面说的算法介绍一下,我选了SVM
SVM的基本介绍
其目标函数是咋样的
SVM如何计算结果的
面试结束,感觉基础部分回答的不算很好,但总体感觉还行。
最终等了一周收获了offer,不过因为个人原因我最终没有去,感觉有点小可惜吧,滴滴的算法offer还是很香的。也不知道是哪个小伙伴拿到了我的名额,恭喜恭喜。总之,感觉基础知识+项目+算法题还是要好好准备,而且在面试一定要自信些。