22届考研(oD)-Java面经
个人背景
22届本科,软件工程专业,考研三战未果。由于零实习/工作经验,市面上大多数公司给不到期望的薪资,甚至直接没有面试的机会,所以于我而言华为od是个不错的机会。
机试
100分题*2
1.给一个字符串,求字符串中所有整数(包含正负)的最小和。
例如aa123aa的结果为1+2+3=6,aa1-23的结果为1-23=-22而不是1-2+3=2。总而言之,遇到正数要拆开算,遇到负数要合并起来算。
2.给定一棵树的总节点数和各个节点的值,然后用若干对(n1,n2)来表示节点间的父子关系,每个节点及其直接子节点视为一个家庭,求最富裕家庭的财富和。
我的题解是用一个长度为节点数的数组,数组初始化为各个节点的值,在处理父子关系的数据时,将子节点的值加到对应的父节点上,最后求出数组的最大值即可。
200分题
给一个整数矩阵和一个整数数组,要求在矩阵中找一个宽度最小的子矩阵,子矩阵要包含数组中的所有数。
常见的双指针算法,刷到过此类型的题目直接套用模板即可。
需要注意的是:考试界面提交代码后并不会显示未通过的测试用例,无法像练习时的在线oj网站上那样对错误用例进行针对性的debug,所以编码时需要谨慎处理边界条件和充分考虑到特殊输入。
技术一面
一面的算法题是一道顺序栈题目,给定一个无序的正整数数组,要求找出数组中每个元素右边第一个比它大的数(没有则为-1),最后返回一个结果数组。由于并没有接触过顺序栈的算法,于是暴力求解。
在后面的技术问答环节中,由于前面算法题的不顺利,内心有点紧张,回答得十分错乱,面试官却非常有耐心,在我每一个答得不好的地方都进行提示和讲解,面试环节俨然变成了一节课堂。
技术二面
依旧是开门见山先手撕代码,二面的算法题是力扣的原题,面试官直接给出题号34,让我打开力扣查看题目。题目是较为常见的二分查找题,注意好边界条件即可。
可能是看在我没有工作经验,二面的技术提问十分基础,看过Java常见面试题基本都可以答出。还能回忆起的题目有:
Java中char占几个字节。
String是否可以被修改及其原因。
StringBuffer和StringBuilder的区别。
JVM运行时内存区域。
深拷贝和浅拷贝的区别。
资面、综面
由于放假的缘故,整个面试流程拖得比较久,之前的部门迟迟审批不下,在栗栗姐的帮助下调了一个部门,很快通过了审批。所以前后经历了两次资面+综面,总得来说只要正常沟通、接受加班就不会有什么问题,这两个环节不必担心。
总结
1、机考准备
机试前建议先温习一下常用数据结构的用途和Java集合类的常见方法,参照栗栗姐的资料,根据自己的情况来刷题,时间紧张的话就分题型来刷,确保每个题型都能覆盖到,这样即使没有碰到原题也能举一反三。机试的时间还是比较充足的,如果没有把握的话可以先做200分的题,拿下后再做前面两道100分的题。
2、面试准备
面试的手撕代码一般难度和机试题差不多,机试通过后也不要停止刷题,保持好准备机试的节奏和手感。面试时不要紧张,即使遇到没接触过的算法面试官也会尽可能地提醒和帮助。至于技术问答,一方面是Java八股,这个可以参考栗栗姐的面试指南,上面收录了常见的Java八股;另一方面是要熟悉自己准备的项目,对于项目中的每一个技术点都要了解使用的原因和具体的用法。
3、整个面试过程感受
整个面试过程环节比较多但是难度并不算高,只要耐住性子认真准备问题不大。遇到的面试官都十分亲切且专业功底深厚,这一点值得好评。另外,要感谢一下对接人栗栗姐不离不弃的陪伴,准备+面试前后两三个月的时间,每一个环节都能提供建议、指导和及时的反馈。