腾讯远程电话面试经历分享

本人明年就要毕业了,3月份正好是各大互联网厂商开始春招和暑期实习招聘的时候,在完成了目前所在实习公司的一个任务后,我终于腾出手来无脑投一波实习。其实作为转行的,本来对这些大厂抱的希望也不是太大,但是总是要试一试的,即使是失败经验也是有用的经验。被腾讯面试官碾压一遍也能更好地找到自己的不足。

我本来是在某个周五早上的中特课给腾讯、阿里、华为、字节跳动、商汤科技等公司都无脑投了一波简历。因为有一个同学告诉我,他本来连C++都不会,然后无脑海投了一波互联网实习,结果就有一家不错的互联网企业给了他offer。因此我也打算采取类似的策略,何况我还是会C++的。。当天傍晚我就收到了一个深圳的电话,一开始还以为是什么推销信用卡的骚扰电话,好在最近脾气比较好,就蛮接起来看看,结果告诉我是腾讯的打算来电话面试。还在吃饭的我只好说要不过一小时面试吧,面试官估计周五晚上也赶着早点下班,就跟我说要不周一傍晚六七点时候给我打电话,我也同意了。

接下来我就花了三天时间准备这个面试,周一的实习也翘了,详细准备了一下自我介绍、项目经历(包括其中遇到的难点),还有去搜了一下C++、数据结构和算法、TCP/IP还有操作系统等方面可能的面试题,事实证明这些准备还是挺有意义的,我基本蒙中了八成的面试题(虽然问的难度比我准备的要难多了。。)注明一下,我投的这个岗位是移动互联网开发,就是Android、IOS做app的。腾讯的校园招聘网上会标明出每个岗位的报录比,在暑期实习里报录比最低的是6比1的安全技术岗位,最高的是37比1的数据分析岗,常见的一些比例都是10比1、12比1这样,人人转CS的时代是真的可怕。。我也不敢投图像处理、语音处理这种热门岗位,就投了报录比7比1的移动互联网开发,它的岗位要求是这样的:

腾讯远程电话面试经历分享

看起来要求稍微少一点,不是那种一下上来十几条要求还让你有一年以上深度学习开发经验或者在什么顶会上发表论文的那种岗位。。于是我就投了。接下来说说周一傍晚的面试过程,之前和我约的是周一傍晚6到7点面试,我在房间里等到6点半左右,差点以为对方忘记了,结果一个电话就拨了过来,然后面试开始(因为面试过程太长,有一些意义不大的问答就不写了):

对方:给我讲讲你最近的项目经历吧。

我:一通说了下最近在公司实习的那个东西。

对方:你这个写的是个算法、还是个可执行文件、还是什么。

我:我写的就是几个函数,处理一些什么什么问题。

对方:那就是写了一个函数?

我:应该说是几个函数,有一个主函数调用几个子函数,这段程序是放在整个软件框架里给其他程序调用的。

对方:那我知道了,你这个就是一组函数。你函数的输入是什么?

我:是一个矩阵。

对方:一个矩阵?

我:我的函数里用了很多OpenCV的函数,所以输入的是一个OpenCV的矩阵。读进来的是一张图片,用OpenCV的读取函数成为一个矩阵。

........

中间又问了很多项目细节,总之就是问你函数的输入输出是什么,做了什么工作,如何被其他函数调用。

........

对方:你这个项目中遇到的难点是什么?

我:又blabla

对方:我理解你这里面尝试了很多方法来完成任务,那么你有尝试什么办法去优化这个算法。

我:有啊,比如图片的上半部分基本是天空,不管从我们人的视角来看还是装在车上的相机的视角来看,上半部分都不可能有车道线存在,在处理的时候是可以直接忽视的。

对方:这个最多只能提高你的运行效率吧,可以提高准确率吗?

我:又说了很多相关的处理细节。

对方:那你对霍夫变换这个函数的改写,主要目的是什么?

我:又blabla,主要还是说原来霍夫变换的缺点,改进之后提高的效率。

对方:这个真的可以提高准确率吗?

我:是的,经过实验,准确率有很大的提升。

对方:那你这个程序的时间复杂度是多少?

我:(我曹尴尬了。。从来没想过这个问题)随便编了一个一张图片多少毫秒吧。。。(中间又经历了一些尴尬的问答)

对方:那你在读取图片的时候,有新建一个同样的矩阵之类的去保存它吗?

我:又blabla(其实这里也很尴尬。。感觉在公司里没怎么考虑过这几个问题,时间空间效率什么的感觉差不多就好,也没去细究)

对方:那你有想过什么办法去优化这个存储效率吗?

我:比如可以减小图片的分辨率,还有就是每个像素存储的位数可以小一点。

对方:我觉得你这个程序用C写也是可以的嘛。

我:(。。。又尴尬了,好像确实可以用C写)C++有一些C里面没有的特性,比如说引用,还有类,这些都是C里面没有的,还有OpenCV只有1.0的时候是支持C的,在2.0之后就抛弃C了。我的这些函数还有一些参数都是写在一个类里的。

(其实我回头想想还有一些可以说的:比如C虽然可以函数形参可以用指针来避免大规模矩阵的复制,但是指针容易引起内存泄漏,尽量用引用代替比较好。C++可以使用的第三方库比较多,比如线性代数库Eigen,如果用C去自己开发,会非常影响开发效率,而且出现异常的概率更高,并且Eigen库里对矩阵的很多计算进行了优化,运行效率比自己写可能要好很多。还有可以讲的就是C++有STL库,它们不仅使用方便而且运行效率高,可以极大方便开发。总之如果面试C++还是可以好好去研究一下C和C++的区别的)

对方:你了解你们这整个程序框架吗?

我:我知道其他部分的功能是什么,但不清楚具体程序是怎么写的

对方:那你可以说说引用和指针的区别吗?

我:(还好这个问题准备过,就按之前准备的回答了下)

对方:那你这个函数里,什么时候用指针,什么时候用引用。

我:能用引用的地方基本都用引用了吧,很少用指针(好像是因为指针的地方都被底层那些函数库封装起来了我也看不到。。临时想也想不出来,这个问题也可以去好好想想)

对方:怎么可能只用引用不用指针。你刚才说到类,那你知道虚函数是什么吗?

我:(还好这个我也准备过)

对方:那虚函数的作用是什么?

我:(继续按准备的说)

对方:那如果没有虚函数,会有什么影响?

我:无法实现多态,基类的指针或者引用即使指向派生类,调用这个函数的时候也只会调用基类的。

对方:那你知道虚函数是怎么实现的么?

我:(md问这么深,虽然看过但是觉得太深入了根本没细看啊。。)虚函数表。

对方:那这个虚函数表是怎么实现的

我:(这里真的不知道,随便编了一下,估计是答错了)

对方:你开发C++,是在什么环境下。

我:是在linux下面用emacs开发的。

对方:那你知道linux下的多线程是怎么实现的么

我:(。。。这个在我的准备体系里完全没有啊,我以为最多问问linux常用命令是什么)只好说我平常不怎么用多线程,这个真不会。。

对方:那你用过STL库么?

我:STL库?(这里主要是发音问题,我听成STI了,不过幸好反应还可以),你是说标准模板库啊

对方:对

我:用过

对方:那你最经常使用的是哪几个容器呢?

我:比如vector,list,set,map这几个是最经常用的。

对方:那你为什么要用map呢?

我:因为可以实现键值对的查找,而且它的底层实现是红黑树,查找删除访问的时间复杂度都是logN。还说了一下map和unordered_map的比较

对方:键值对的查找?那我用list里面存pair也可以做到啊

我:list插入删除快,但是查找很慢啊,是线性时间复杂度。

对方:那你说说红黑树的优点吧

我:(大概说了一下)

对方:那它有什么缺点呢?

我:就是插入删除相对而言比较慢

对方:红黑树怎么会比链表慢?

我:红黑树是查找速度比较快,但是插入删除的时候要继续保持红黑树的结构,所以需要调整里面的节点。链表插入删除的时候只要调整前后两个节点就行了。(感觉这里答的也不好,真记不太清了,数据结构最没认真看的就是红黑树,而且很久没看了。。)

对方:那你可以跟我说说红黑树插入删除时候的过程吗。

我:这个我不太记得了,我可以大概讲讲,不知道对不对。然后blabla

(中间好像问了一些技术问题,我有点不记得了)

对方:那你再讲讲hash表是怎么实现的吧

我:(这个其实我是知道的,不过当时有点紧张,有点语无伦次,不过基本回答上来了)

对方:最后考你个编程题吧,图像上下翻转实现。

我:这个图像是三通道还是单通道的

对方:你自己讲

我:(大概说了一下)

对方:你先说这个函数的输入是什么

我:就要翻转的矩阵的数组的指针,然后数组的行长度和列长度。

对方:就只要这几个么?

我:(暂时没想到有其他的)对。

对方:你这个完全不考虑用户怎么调用啊,也不考虑异常。

我:用户调用的话,那我刚才那个可以修改一下,输入增加一个输出数组的指针,直接把对应位置的值赋值到这里面。如果出现异常,在退出前清除这个输出数组。

对方:就不检查一下输入?

我:要检查一下输入的行和列是不是大于0,但是每个像素的值应该不需要检查,那是读取图像应该负责的事情,翻转的时候只要翻转就行了。

(这个题目回去好好想想。。感觉对方很在意用户调用的体验还有异常处理)

对方:我的问题基本问完了,最后你有什么问题。

我:第一个问题是这个面试如果挂了,后面还有调剂的机会么

对方:这个简历是开放的,每个事业群都看得到,他们如果有兴趣就会对你发起面试。

我:假设这次面试过了,后面还有几轮面试,有笔试吗

对方:一共有三四轮面试,笔试要看面试官的兴趣。

我:那我想问一下您是做什么的

对方:我是做移动社交app开发的

我:那应该也有ios和Android之分吧

对方:对,我是做ios的

我:我还想问一下,我是一个转行的,为什么您会对我发起电话面试呢,应该不是每个投简历的都会被约面试吧,就是说我的简历上面您最看重哪一点呢

对方:是这样的,Android这些呢应届毕业生的话有开发经验的很少,所以我们更加看重基础知识的掌握,最好还有相关的项目经历,但项目经历不是必须的。

我:所以我通过筛选的原因就是我上面写了自己有C++的开发经验,并且有一段相关的实习是吧

对方:对的

我:最后还有一个问题,可以大概评价一下我这次的面试吗。

对方:中等……中等偏下吧

我:(虽然很尴尬但好像说的也对)好的

对方:那这次的面试就到这?

(然后面试就结束了)

面试整体问了五十分钟,其中项目经历就问了三十分钟,剩下的二十分钟集中在C++、数据结构、操作系统上面,而且面试官特别爱问时间空间复杂度、底层数据结构这些。可见数据结构和算法是最重要的。如果还要现场写代码的话,一定要多上leetcode刷算法题。。

其实看了网上的一些腾讯面试经历,自己作为一个转行狗已经预料到会被面试官各种碾压了。但是面试过程中被各种细问还是慌的一比,问了二十多分钟就开始狂抖了,感觉就像受审判。

不过大家脸皮一定要厚,有些东西不试试更没有机会,如果自己菜去不去面试都是菜,只不过被碾压一遍更能发现自己的菜。面试官的问题也非常有帮助,感觉有些地方之前写程序一直没好好考虑过,比如时间空间复杂度还有异常这些。另外花了三天搜集可能的面试题也是一次很好的复习机会,后面再针对面试被问的问题好好回去想想该怎么回答,对自己的知识掌握程度还有项目都会有很大的帮助。

另外就是实习经历是真的重要,感觉自己的简历没有直接被扔进垃圾桶,还让面试官愿意腾出一个小时来面试一下的重要原因就是上面有一份实习经历。而且确实在实习的时候我也更加深刻理解了C++ Primer上面的一些知识点,所以大家一定要早点出来找实习啊,特别是准备转行的学校里没有机会锻炼的同学们。。