腾讯互娱C++面经(两轮技术+一轮HR)

前些天完成了腾讯互娱的面试,时间大概一周左右,不得不说腾讯的效率还是挺高的,不过面试流程有些诡异。
楼主之前内推的WXG,结果一面GG,正式实习招聘被IEG捞了起来,前两轮都是深圳的电话面试,HR面在武汉现场。岗位是后台开发。
总的来讲,面试体验还是非常好的,面试官水准很高。
一面:
一面直接从做的东西开始聊,中间穿插着问了很多C++内容,计算机网络一点没问(我提到自己没有写过后台的东西),算法没问。
Q:你的这个游戏,自己做的核心内容是什么。
A:我自己实现了怪物AI的有限状态机,后面又使用行为树进行了重写,寻路算法部分,我这一块用的是自己写的A*算法。
Q:A*算法是自己写的对吧,具体怎么实现的。
A:我使用哈希表作为地图的基本结构,openlist和closelist都采用的这种数据结构,启发式部分,使用的是最简单的曼哈顿距离作为启发式第二项的值,第一项的值就是根据parent结点进行更新的距离起点的值。
Q:有没有比较过自己的实现和其它实现,具体的区别在哪里。
A:这个有比较过,我感觉最大的区别之处就在于两个点的处理,第一个点,openlist的插入,我的实现是哈希表,所以插入是O(1)的,对方维护的openlist是一个有序数组,插入是二分查找,是O(logN)(这里实际上答错了,后面追问的时候更正了),第二个点,找出openlist里启发式值最小的结点,我的方法需要遍历所有点,因此是O(N),而对方因为是有序数组,只需要取第一个结点就可以了,因此是O(1)。
Q:如果维护的是一个有序数组的话,那插入一定会有数组部分的后移,还会是O(logN)吗?如果取第一个结点,那么删除之后,也会有移动。(这里面试官真的非常好,点出你的错误,让你有挽回空间)
A:我上面的答案有错误,数组也可以是一个最小堆,对方的写法应该是最小堆,插入是O(logN),删除也是O(logN)。
Q:嗯,如果是最小堆,那两种方法的效率对比?
A:这个要看具体的情况,需要实验性的评估,因为不能够确认两者的具体时间消耗对比。
Q:最小堆的话,删除是怎么做的?
A:删除最小堆顶的元素后,把堆末尾的元素放到堆顶,与其余两个元素比较,进行下沉操作,因此复杂度是O(logN)。
Q: C++的两种map?
A:unordered_map和map。前者是哈希表实现,后者是红黑树。
Q:红黑树的性质?
A:5个性质
Q:红黑树和AVL树相比呢,优势在哪里?
A:两者都是特殊的BST,相比AVL,红黑树不要求严格的1的高度差,对于插入操作,两个树类似,最多旋转两次,对于删除,红黑树最多旋转3次,而AVL树则是O(logN)。
Q:那红黑树的高度差最多?
A:2.(这个问题其实很简单,但自己蠢了,半天没答上来,原因就是高度两倍的性质,因此高度差最多2)
Q:问一些C++的内容。sizeof空类的值?
A:不包含虚函数就是1,包含虚函数4或8(虚表指针,32位4,64位8)。
Q:C++多态?
A:这个问题已经重了,答到虚函数表就OK。
Q:多重继承下的内存结构?
A:简单来讲,多重继承的子类本身会有多个虚表指针,分别指向多个不同父类的虚表。如果有新的虚函数定义,则会在第一个虚表的末尾增加新的函数地址。(这里庆幸没问菱形继承,这个是真的不懂)。
Q;C++ 11的新特性了解吗,讲一些。
A:最常用的是自动类型推导,其实跟模板类型推导类似,右值引用,lambda表达式,智能指针等。
Q:讲讲智能指针吧。
A:三种智能指针, shared,unique,weak
Q:shared的原理?
A:shared维护了一个指向control block的指针,control block内部包含了智能指针对象的引用个数。
Q:避免死锁?
A: weak
Q:weak_ptr原理?
A:weak count, weak count是弱引用的个数,弱引用个数不影响shared count和对象本身,shared count为0时则直接销毁。
Q:如何判断weak_ptr的对象是否失效?
A:我个人认为应该使用的函数是lock(),lock会返回shared指针,判断该指针是否为空。use_count()也可以得到shared引用的个数,但是速度较慢。
Q:shared和unique区别?
A:unique具有唯一性,对指向的对象只存在唯一的unique_ptr. unique_ptr不可复制,赋值,局部变量的返回值除外。与shared_ptr相比,若自定义删除器,需要在声明处指定删除器类型,而shared不需要,shared自定义删除器只需要指定删除器对象即可,在赋值时,可以随意赋值,删除器对象也会被赋值给新对象。
Q:原因是什么?
A:unique的实现中,删除器对象是作为unique_ptr的一部分,而shared_ptr,删除器对象保存在control block中。
C++的部分大概就问到这里了,接下来15分钟就是问研究的东西。之后的一个没答好的问题,面试官问,多线程和多进程比,为什么消耗更小,假设他们的调度策略类似。
A:这个问题真的没答好,当时的回答是,线程切换时,需要保存的信息更少,而进程切换时,换页过程,重新从磁盘将进程换入内存的过程都很耗时,进程间的通信也更加复杂。
最后面试官的意思是,要多准备一些关于并发的内容,如果从事后台的话。
二面:
二面非常短,大概15分钟结束,面试官应该是项目总监,没有问具体问题,就是简单问了下项目,然后具体探讨了要做什么的问题,因为我自己的想法是从事C++相关的开发,然而并没有后台经验,可能面试官对于这一点还是有疑虑,最后说的是可以先过来写后台,如果不合适再转到前端。(大概了解到是用Unity,我个人不喜欢这个引擎)
HR面:
一些常见的问题,遇到的最大挫折之类,对游戏沉迷的看法,玩过哪些游戏,怎么看待腾讯游戏的负面等等。最后问到offer情况,我提到已经拒了蚂蚁,手上有网易互娱,之后的问题就是比较一下这俩公司。然后大概的后续就是说腾讯的企业文化更加开放包容之类,希望能够来腾讯实习。
#实习##面经#
全部评论
多线程比多进程消耗小是因为进程是资源调度和分配的基本单位,有独立的地址空间,而线程是cpu调度和分配的基本单元,本身不拥有资源,只拥有堆栈、局部变量等少有资源
2 回复 分享
发布于 2018-07-09 09:48
楼主这是春招 还是实习....
1 回复 分享
发布于 2019-11-30 17:02
真大佬
1 回复 分享
发布于 2018-04-23 13:29
出来看神仙
1 回复 分享
发布于 2018-04-23 14:16
请问你现在处于什么状态,我19号HR面,现在还是HR中。iEG测开
点赞 回复 分享
发布于 2018-04-23 13:16
实习要求是半年是么
点赞 回复 分享
发布于 2018-04-23 15:40
Orz我天,知识好全面啊
点赞 回复 分享
发布于 2018-04-24 00:25
**,真大佬
点赞 回复 分享
发布于 2018-04-24 10:17
跪求大佬C++学习经验!Orz
点赞 回复 分享
发布于 2018-04-24 11:08
楼主很强,仙啊
点赞 回复 分享
发布于 2018-05-07 08:47

相关推荐

像好涩一样好学:这公司我也拿过 基本明确周六加班 工资还凑活 另外下次镜头往上点儿
点赞 评论 收藏
分享
10 178 评论
分享
牛客网
牛客企业服务