网易互娱C++岗一面面经(凉面)

前言

  我报的网易互娱的提前批游戏研发工程师C++岗,这个过程其实挺坎坷的,8月初跟着导师去黑龙江佳木斯开会,中途忽然间接到通知要笔试,从会场逃出来在宾馆做的远程笔试题,做的不是特别好,4道题只做对了一道半,没想到还是过了笔试,感觉网易互娱的笔试不怎么刷人。但是面试就比较全面了……现在想想,挺遗憾的,其实也没什么难的,基本上在书上都能找到,只是自己准备的太晚,很多东西复习的不好罢了。这是我2018年秋招参加的第一场面试,没想到最想去的网易居然是拿来试水并毫不意外的挂掉了,有点难过。想进网易互娱的同学,如果本身能力不是特别强,还是要早点准备的好。

面试经过

  网易互娱的一面是电话面,2018年8月24日(周五)下午4点打来的电话,和之前通知的时间点一模一样,面试官非常准时。
Q:您好,请问是XXX同学吗?
A:您好,我是。
Q:我是网易的XXX,请问现在是否有时间,我们……(一堆客套话)
A:有有有,方便方便方便(有点紧张,都是连续说了3遍)
Q:请问您最常用的一门语言是什么?
(可能是公司要求,面试官挺客套的,全程是您,我每次答完之后,都会说好的,特别客气)
A:C++比较熟悉一点。
Q:好的,那么下面开始我们今天的面试,解释一下C++中override和overload的区别?
A:(没想到上来就问这个,有点懵逼,停顿了大约5秒钟)overload是函数重载,C++支持同名函数不同函数参数形成重载机制,override是函数重写,继承中,子类方法重写父类的虚函数(之所以先说的overload,是最开始没想好怎么解释override,有点紧张了,这里犯个失误,C++对继承的叫法是基类和派生类,而不是父类和子类,函数也不能叫方法,但是面试官默认了这一个叫法,因为下面他用父类子类来提问的,看来无伤大雅)。
Q:好的,那么父类和子类如何实现多态机制呢?
A:主要是通过虚函数表来实现的,基类的函数被定义为virtual,派生类方法可以进行重写定义自己的行为,其中包含定义为virtual函数的基类隐含一个指针成员,指向虚函数表,该表按照虚函数声明顺序保存地址,派生类中也包含这样一张表,如果发生重写,就更新虚函数表的地址。
Q:好的,C++ STL库了解吗?
A:了解,但是不是特别深入(我其实对STL算比较熟了,但是我怕他问我底层实现,尤其是《STL源码剖析》那本书,没怎么看过,有点虚……)
Q: 好的,那说一下,vector、list和map三者有何区别?
A:vector底层是对连续内存的封装,支持随机访问,访问效率较高,list底层是链表结构,内存分布不连续,但是易于移动和删除,map是一种键值映射关系,底层由红黑树实现,默认按键值升序排序。
Q:好的,用过Boost库吗?
A:用过一点,不是特别熟(真的不熟……)。
Q:好的,能讲一下吗?都用Boost库做了什么?
A:只用过Boost的智能指针,auto_ptr和shared_ptr,两者都是体现的以对象管理资源的RAII思想(《Effective C++》里面有讲到过),其中auto_ptr对对象是独占式管理,多个指针指向同一个对象,只有一个是有效的,其余都是NULL,当发生复制运算或者赋值构造函数时,被赋值的对象获得对象的唯一管理权,而原指针被置为NULL,auto_ptr会在指向的对象作用域过期时自动回收资源。shared_ptr是引入计数方式的智能指针管理类,允许多个指针指向同一个对象,并统计指针数量,当不再有指针指向资源时,自动释放资源。两者都保证了资源引用的安全释放,类似于Java的GC机制。
Q:好的,那什么是C++的异常机制?
A:(不是很熟悉,凭印象答了一下定义,感觉不是面试官想要的答案)异常用的不多,不是特别熟悉,异常机制是C++增强代码健壮性以及运行时安全的一种机制,主要通过关键字try/catch/finally/thrown等来捕获异常,以及系统定义的异常类Exception等来进行异常处理。
Q: 好的,讲一下深拷贝和浅拷贝的区别。
A:深拷贝是增加了一份数据副本,对拷贝的对象逐位复制,开辟新的内存,数据相对独立而安全。而浅拷贝只是增加了一个指向,并没有增加数据量。需要注意数据指向安全和资源管理。对于类而言,主要通过自定义拷贝构造函数和复制构造函数来管理深浅拷贝,一般而言,深拷贝只拷贝非静态成员。
Q:好的,C++提供了哪些强制类型转换符?
A:dynamic_cast、static_cast、const_cast和reinterpret_cast。然后简单说了一下各自的作用。
Q:好的,能讲一讲程序运行时的堆和栈。
A:栈是由编译器自动管理的区域,主要存放局部变量等,堆则是由程序员控制,分配内存等。(感觉答得太简单了,应该更深入一点的,讲讲实现)
Q:好的,什么是堆?
A:(犯了一个低级错误,因为上个题刚问过我C++堆栈,我以为是内存的堆,结果答错了,经面试官提醒,才知道自己答非所问,他问的是数据结构的堆,又重新说了一下……)。
Q:好的,你知道的排序有哪几种?
A:选择排序、插入排序、冒泡排序、快速排序、堆排序、归并排序(怕问的太深,没敢说太多,只说了最基础的几个)。
Q:好的,解释一下什么是快速排序,时间复杂度如何?
A:选定一个中枢值,将待排数据分割为两部分,左边的都比这个值小,右边的都比这个值大,然后递归执行左右子区间,直到全部有序。时间复杂度因情况而已,数据基本有序的状态为O(n^2),一般情况下是O(n*logn)。
Q:好的,解释一下什么是哈希表?产生冲突了如何解决?
A:一种简直映射关系的数据结构,主要用于查找。(解决冲突当时没反应过来,我凭印象说了个开放寻址法)。
Q:好的,解释一下红黑树?
A:不好意思,我对红黑树不是很熟悉,只知道它是一种平衡树,主要是用于优化查找和排序的。
Q:好的,如何对一张图进行遍历?
A:深度优先,广度优先。
Q:好的,那什么是深度优先,什么是广度优先,两者有何区别?
A:深度优先就是从一个顶点出发,从改点的任意边开始向下遍历,直到所有路径上的所有顶点都被访问为止,广度优先就是从一个顶点出发,先访问改点的所有邻接顶点,然后再遍历所有邻接节点,直到访问整张图。
Q:好的,什么是动态规划?
A:(简单解释了一下动态规划的定义)动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。
Q:好的,解释一下主流网络模型
A:(最开始没懂啥是网络模型,面试官提示了一下,我说的是五层的,感觉应该他想问的是七层的)物理层、数据链路层、网络层、传输层、应用层。
Q:好的,什么是TCP/IP协议?
A:(解释了一下定义)TCP是传输控制协议,IP是网络协议。
Q:好的,那么TCP/IP协议,分别位于OSI模型的哪一层?
A:TCP位于传输层,IP位于网络层。
Q:好的,TCP三次握手过程。
A:(大致说了一下流程,当时网络没怎么复习,说的不太细,感觉面试官不怎么满意……)。
Q:好的,TCP和UDP的区别。
A:TCP是面向连接的,保证传输数据安全。UDP是无链接的,尽最大努力交付(我仅仅回答了面向连接这一点,感觉远远不够)。
Q:好的,说一下HTTP的长连接和短连接?
A:(完全懵逼,网络没怎么复习,HTTP不怎么会)不好意思,这个不会。
Q:好的,做过scoket编程吗?能不能讲一讲?
A:不好意思,没有做过scoket编程。
Q:好的,做过网络编程吗?有没有做过网络编程开发?
A:(我回答说之前用Qt做过一个天气预报的小插件,使用的QNetworkAccessManager、QNetworkManager、QNetWorkRequest等使用,以及解析JSON等,说了一堆)然后追问,用的什么协议?我回答,用的顶层的API,没有参与协议的编写,应该是基于TCP的(感觉面试官并不喜欢这种API调用,更喜欢你能实现底层原理)。
Q:好的,进程和线程的区别?
A:(解释了一下定义)进程是操作系统进行调度和资源分配的最小单位,线程是调度的最小单位,进程拥有独立的资源,线程依附于进程,共享资源(感觉答得太简单了)。
Q:好的,进程中虚拟地址和物理地址是如何转换的?
A:(感觉很熟悉,但是记不清楚了,凭感觉说了一下,貌似没说对……)
Q:好的,如何实现线程同步?
A:互斥锁和信号量。
Q:好的,进程通信,有哪些方式?
A:共享内存、管程等(最开始说错了,说成共享资源了,面试官提示了一下,是共享内存吗,我说是的是的是的……)。
Q:好的,做过Linux编程吗?
A:没有,不好意思(贼尴尬)。

基础问了一大堆,之后就是算法题了,答得惨不忍睹,更重要的是,当时实在是太紧张了,很多问题,其实不难,但是没有向面试官展示自己分析问题的能力就直接放弃了,感觉这也是我电面没过的主要原因吧……


Q:从n个数中取前K大的数,求时间复杂度?
A:我想了一下,用的快速排序,时间复杂度O(nlogn),但是面试官又问我,数据量非常大的时候怎么办?能不能做一下优化?我想了半天没太好的想法,后来查了一下,这其实是个TOP n的问题,《剑指Offer》上有相关的讲解,但是我没复习到,用堆排会好很多,数据量大的时候比较省内存,同时比快排稳定。
Q: 有一张游戏地图,地图上有一个圆,如何从地图中圆内统计人数,并求时间复杂度
A:(听懵逼了,在线笔试的时候就遇到了荒野求生的题,没想到电面居然还有,我用最简单的方法,直接对坐标进行遍历,计算圆的边界,每一个人的坐标是否在范围内,他问是否能进行优化,又是优化,汗!!,我想了半天,还是没想出来,就说一时半会儿没有很好的想法)。
Q:从n个数中,找到一定范围数,时间复杂度。
A:(我没想出来,就说,直接遍历,对每个数据进行判断,他说这个太简单了,能进行优化一下嘛?我想了一会儿,没把握,就说不是很清楚,他说可以先做排序,然后直接取范围内的数,我有点懵逼,排序的消耗应该比遍历的要大的啊,但是没敢问……);
Q:如何从n个数中,删除重复的数据
A: (感觉用哈希表应该可以,我说如果数据分布不是很大,可以用哈希表,他问时间复杂度,我说趋近于o(n),没说行不行,也没让继续优化,这是还可以的意思?不知道……)。

然后就是让我问他几个问题了,我大概问了一下接下来的面试流程,如果过了电面还有几轮,他说,电面过了大概还有2~3轮,包括技术面和HR面,地点可能在杭州,具体待通知。如果不过,正式秋招没有第二次机会(难受,一直以为提前批可以多一次机会……)。

总结

  总的来讲,面试还是比较基础的,主要包括编程语言、计算机基础和算法分析设计3部分,我编程语言这一块答得还挺好的,基本上没怎么被难住,都是平时经常用的,所以比较熟悉吧。但是计算机基础和算法这块,有点弱,因为之前5~7月份的时候一直在参加互联网+比赛,8月份的时候又去开会,自己又不是那种特别拼命挤时间的类型,所以复习的比较晚,很多地方没顾及到,所以就悲剧了……现在12月份再回头看,感觉这些问题都挺基础了,自己当时弱爆了……
  建议——
  1. 《剑指Offer》是本好书,很多算法题都从其中找到原题,如果不是ACM大神,还是早点刷刷这本书吧;
  2. 编程语言:多看看《C++ primer》或者其他经典书籍,行有余力推荐看看《Effective C++》。还有STL要熟悉(常用容器和算法),如果可能,最好把《STL源码剖析》这本书也看一下,对数据结构也是一种提高。
  3. 基本概念要会,更重要的是,要会说,我发现其实很多东西,都是知道,但是说的不溜,给人的感觉好像我很菜一样……到秋招后期,身经百战的我也变得贼能说,看来没事还是要自己私底下多练练。
  4. Linux和网络编程,由于实验室的缘故,没搞过这个,但是面试官贼喜欢问,有空多搞搞,记住几条shell指令也挺好的,不能给人的感觉是这玩意儿我压根不知道是啥……

你可能感兴趣的:(面试)