一面: 大约一小时,除了自我介绍,其余纯算法题
一共三道题:
- 中序遍历非递归实现
这个题其实不难,但是刚开始写的时候还是没思路,因为写惯了递归的。但是其实首先应该想到栈这个数据结构,因为递归和栈是密不可分的,而且非递归实现,那就是用循环实现。** 非递归即循环 **
以栈不为空为循环终止条件,用 do while 来实现。先把根节点入栈,然后有左孩子,左孩子入栈,继续下轮循环;如果没有左孩子,则打印栈顶元素,并出栈,如果栈顶元素有右孩子,则压入栈中,否则继续循环。 - 合并有序链表
就是常规的 merge 操作,创建一个 dummyHead,然后往上面挂节点即可。 - 三数之和或两数之和
这个题是因为前两道做完时间还有,所以临时加了一道。基本思路都是先排序,两数的话,可以在内层循环用二分搜索,提高效率。三数的话,求出补数后,内层循环用一对头尾指针来做,如果两指针和比补数大就左移尾指针,小了就右移头指针。
这道题主要考察就是内层循环的效率优化。只说了思路,最后没写全部代码,一面就结束了。
面试官说,你会 js 也是你的一个优势。
二面: 大约一小时40分钟,也全是算法题
面试官比较严肃,不是很友善。问我带简历没,但是我没打印,因为实验室打印机坏了。先让我介绍自己在项目中遇到最难的一个问题,并回答怎么解决的。我先说了三维压缩的部分,他觉得太多了,没重点,有点不耐烦。后来我又说了实习中开发的微信组件相同随机数的。
一共三个题,前两个写 code,第三题讲思路
- 二叉树节点的最大距离
这道题其实就是二叉树叶到叶的距离,但是我没看过这道题,所以是现场做的。刚开始我用递归写的,只写出来经过根节点的情况,然后面试官提醒为什么一定要经过根节点,把所有情况列出来。我列了两种,1. 最大距离经过根节点
,2. 不经过根节点
,然后他说细化一下。因为我已经写出的是不经过根节点的,取左右子树中的较大值。所以再需要一个方法,递归地求解二叉树的左右子树层数,再相加。然后比较这两种情况的结果,取最大值即可。反正最后写了好几个方法,总算写出来了。
总之二叉树的题要优先考虑递归。 - 给一个字符串,判断是不是合法的IPV4地址。
我本来准备用正则写,发现不好写。然后用代码,思路是先把字符串用.
分隔,然后对分隔后的数组进行一一判断。判断是不是数字,并且有没有超过255。本来写的很简单,主要是判断字符是不是数字的方法和 stoi 的方法,他让我再实现一下,反正都实现了。
两题完了时间也到了,然后问了点随便的问题,结束。
三面:一个小时,算法 + JS 基础
- 实现一个字符串转整型的方法,即 stoi,要求考虑所有情况,因为上一题也过,所以这次不慌,写出来后说没有考虑溢出,并且要优化。我就把转数字的操作不用栈了,直接字符转数字后 + 前面的数 *10.
- 实现一大串英文中单词的反转,即最前的单词放到最后。这个我想起来了,就把字符串先 reverse, 然后再对每个单词再 reverse,而且循环终止条件只要到字符串长度一半就好,也写出来了。
最后问了一点js的变量提升,es6理解,vue和react区别,就结束了。
总共三面,一共将近5小时,体验一般。但是好的是下午就发了通过邮件。