记一次腾讯远程电话面试

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

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

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

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

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

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

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

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

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

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

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

我:是一个矩阵。

对方:一个矩阵?

我:个人函数里用了不少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上面的一些知识点,因此你们必定要早点出来找实习啊,特别是准备转行的学校里没有机会锻炼的同窗们。。