百度三面(终面,六十分钟)
软件研发
照例,先自我介绍。然后,面试官针对简历问了几个无关痛痒的小问题。
接下来面试官问了 C++ 基础题。重载和重写的区别,以及各自在编译器中的实现方法。我失误的是,当时把重写理解成了隐藏。所以回答第一个问题的时候可能会有些小问题。另外,在回答第二个问题时,我说我不知道重写的实现方法,只知道虚函数的实现。面试官说,重写的实现和虚函数的实现是一样的。我当时还是没反应过来我把重写和隐藏概念理解错了。虽然感觉回答的也差不多,但这一处失误肯定也会产生一定的负面影响。另外,由于我以为三面对技术的要求不会太深,所以在解释完虚函数的实现机制后,并没有对指向虚函数的指针在对象构造、赋值等情况做进一步的解释。
再然后来就直接上手写代码了。第一题,有一个不重复的数组,数组中的元素先增后减,在数组中找到特定元素。题目的要求是,不允许找出“转折点”元素。这道题不难,使用折半查找的思想即可。但是,我虽然知道应该用折半,但刚开始却怎么也无法弄清楚题目可能出现的所有情况。我当时的心情无比煎熬,感觉时间过得很快,又感觉时间过得很慢,总之很是纠结,急出了一身汗。不停地在草稿纸上举例分析,终于把题目可能出现的所有情况弄清楚了。为了装 X,我用了泛型迭代器和 traits 写代码,并在关键的地方加了适当的注释。写好代码后给面试官看。面试官看了一会儿,说,代码基本没问题,但是可以做一个小小的优化。实际上,优化代码我已经写了,但是考虑不周没有写上注释,所以他没看见。我只好给他指出了代码中的那一段优化方案。
第二题,判断两棵二叉树是否互为镜像。这道题是《剑指offer》中的原题。我说我做过,于是只简单解释了下解题思路,没有写代码。
第三题,解析字符串,得到以该字符串构建的树的层级输出。比如,给出字符串:<a><b><c><c/><d><d/><b/><e><f><f/><e/><a/>。这代表 a 是一个包含两个子节点 be 的树;b 是一个包含两个子节点 cd 的树,等等。并认为,a(根节点)为第 0 层、be 为第 1 层,依次类推。将这个树按照层级输出出来,输出要求为:若结点 x 为第 k 层,则先输出 k 个空格,再输出 x 的字符。(即,在字符 a 前面应该输出 0 个空格,在字符 f 前面应该输出 2 个空格)并且,若 i 和 j 均在字符串中出现,且先出现 i 后出现 j,则应该先层级输出 i,再层级输出 j。(即,应该先输出字符 d 再输出字符 e)上面给出的字符串,应该得到的层级输出为:
题目很简单,面试官让我写伪代码,于是写了一下逻辑流程。由于“读入一个字符块”的这一段我写的是伪代码,于是面试官又让我具体实现一下。简单沟通了一下后很快就写好了代码。
最后是我的提问环节。大概问了一下他的工作情况和对百度的看法。也没什么特别的。
我的感受:
二面后自我感觉很一般,但是竟然进三面了。我猜,只要不失误,保证自己能够正常发挥,每次面试都是有机会的。
编程题,如果面试官不是特别愿意和你一起讨论解题思路,那不妨自己在代码中加上关键逻辑的注释。注释不用写太多,但是比较关键的地方一定要写。
三面,自我感觉也很一般。希望能过吧。