面试复盘 | 网易互娱 正式批 面试
本来对于网易的游戏岗位,我最先投递是的网易雷火事业群,后来看见别人推送网易互娱的一个免笔试的活动,恰好符合条件就投递了,后来由于雷火进程太慢了,在邀请面试时,放弃了,就保留了互娱这一个岗位,谁知面完进了互娱的池子....
下面来复盘一下两次面试的内容,欢迎大家一起交流学习~
一面(90mins)
自我介绍
- 基本情况介绍
手撕代码
-
动态规划类型
一开始写了一个暴力遍历的解法,面试官问还可以怎么优化,想了一下说可以通过动态规划来解决,介绍了一下解法思路,面试官说可以,也没让代码实现。..... 面试完了再回顾这道题,竟然发现当初和面试官讲的思路行不通.....哈哈哈哈看来面试官被忽悠住了😝
项目介绍
- C++ 项目介绍,展开问题:
-
C++ 多态介绍下?
分别回答了编译时多态和运行时多态,进而面试官追问到虚函数、虚函数原理....
-
C++11 标准用了哪些?
自动类型推断、匿名函数、移动语义和完美转发,function 类模型和智能指针。
-
介绍下智能指针怎么实现的?
主要对 shared_ptr 和 weak_ptr 进行了提问,包括之间的区别,在底层上是怎么实现的,基本上算是把 shared_ptr 手撸了一遍,这里提供一个参考版本:
template<class T> class smart_pointer { private: T* _ptr; int* _count; public: smart_pointer (T* ptr = nullptr) : _ptr(ptr) { if(_ptr) _count = new int(1); else _count = new int(0); } smart_pointer(const smart_pointer* ptr) { if(this != &ptr) { this->_ptr = ptr._ptr; this->_count = ptr._count; (*this->_count)++; } } smart_pointer& operator=(const smart_pointer& ptr) { if(this->ptr == ptr._ptr) return *this; if(this->_ptr) { (*this->_count)--; if(*this->count == 0) { delete this->_ptr; delete this->_count; } } this->_ptr = ptr._ptr; this->_count = ptr._count; (*this->_count)++; return *this; } T& operator*() { return *(this->_ptr); } T* operator->() { return this->_ptr; } ~smart_pointer() { (*this->_count)--; if(*this->_count == 0) { delete this->_ptr; delete this->_count; } } int use_count() { return *this->_count; } }
-
使用了什么 STL 容器,底层怎么实现的?怎么扩增容量的?
主要回答了 vector 容器,讲了一下 vector 的实现原理,相比于其他容器的特性和缺点,对它的大小和容量面试官也提问了一些。另外面试问能不能自己实现一个容器,来回墨迹半天搞不懂面试官到底是要干什么,也就放弃了...
-
项目中缓存区怎么实现的?怎么实现自动紧凑和增长的?
介绍了下实现原理,因为是基于 vector 来实现的,面试官问会存在什么问题,还可以怎么优化,简单回答了下性能方面的优化思路。
-
select 、poll 和 epoll 的区别?
从结构、功能、性能、可移植方面进行了回答,这问题太常见了所以准备的相当充分,面试官看我回答的比较全面也就没再追问了。
-
介绍下操作系统的进程管理是怎样的?我们用的操作系统使用了那种调度策略?
从进程状态和页面调度两个方面进行了回答...
-
情景题
游戏中假如有一个炸弹,这个炸弹的伤害范围是一个圆形区域,同时在地图里有很多人物,问怎么设计逻辑判断这个炸弹对哪些人物造成了伤害?
- 答:可通过勾股定理计算每个人物与炸弹坐标的距离;
- 问:计算距离涉及到根号计算,复杂度较高,如果了成千上万的人物在地图里,怎么优化?
- 答:对于比较远的人物,可以直接比较单个坐标值,人物某个坐标值与炸弹对应坐标值的超过了伤害范围可直接判断无伤害。
二面(50mins)
自我介绍
项目介绍
-
介绍一下两个版本实现之间的区别;
第二个版本是第一个版本的优化版本,着重介绍了改进的点,以及采用的 C++11 新特性;
-
同步 IO 与异步 IO 的区别?
-
阻塞 IO 与非阻塞 IO 的区别?
-
同步日志和异步日志是怎么实现的?生产者-消费者模型是怎么实现的?
-
定时器是怎么实现的?
-
GET 和 POST 的区别?在解析时需要注意什么?
手撕代码
- LeetCode 爬楼梯
- 输出所有可能的方案不是方案数量——回溯法。
情景题
-
在二维地图中,有一些补给点,还有很多角色,对于每个角色返回距离他最近的补给坐标,要怎么设计?需要注意,补给点是固定的,角色是在地图中运动的。
设计要点:对固定的补给点来设计而不是运动的角色,例如对补给点来设计一种排序,给定一个坐标返回距离这个坐标最近的补给点。
-
情景题:设计一个排行榜,每个角色有一个分数,这个分数是动态变化的,你怎么设计这个排行榜?
这个题目面试官好像是想考察数据结构的,当时回答时主要想设计一个可以动态地、高效地排序的数据结构,需要注意的是除了前十名,后面的角色分数也是要维护,因为可能后面的角色获得一定分数后可能进入前十名。这一题答的不太好,面试官说回去可以再好好研究一下。
总结
因为是投递的游戏岗位,所以网易互娱的面试还是比较有偏向性、专业性的,很多问题都是从游戏开发的角度来进行提问,没有相关经验的话感觉不太好 get 到面试官的点。整体来说,还是有一些难度的,考察的八股等基础知识主要穿查在项目中考察,对代码能力和情景问题的分析比较看重吧。
另外,网易互娱的面试流程真的是太慢了,两次面试间隔了一周,二面完现在过去一个多月了还是没有消息😡
#面试复盘##面经##网易互娱##秋招##C++工程师##游戏研发工程师#