简历是去年在腾讯招聘官网投的,都快忘记这事了,前一周突然来了面试邀请。一共面了两轮,都是电面,现在在等结果。这算是我人生第一次面试工作,还是蛮有意义的,趁着还有印象+录了一部分音,赶紧过来记录一下。

初面

  • 【~1:50】开始是惯例的自我介绍,说了一下专业、成绩、个人特点,(面试官表示GPA有点东西,却不知我就这点东西… my vegetable explodes)
  • 【~7:40】面试官提出让我选一个有代表性的项目介绍一下。针对选的项目,展开问了挺多——遇到了什么问题,怎么处理的,配置方面,分工方面等等。因为做过的项目都是些中规中矩的项目,没有什么很炫酷的技术,所以也没什么波澜
  • 【~9:00】针对简历上提到做过的游戏,进行了一些简单的提问,使用的开发引擎,使用的开发语言,有没有用过Lua等脚本语言,对Python的了解程度如何。我除了C++比较系统的学习过,其他的都说只是有一定的了解,能用的程度……(流下了没技术的泪水.jpg)
  • 【~16:00】面试官听我对C++还比较自信,比较细致的考察了一下各方面基础内容,下面用问答形式给出大致过程。
    • C++11新特性有过了解吗,说一下都有哪些吧
    • 一个是比较好用的关键字auto,¥@#&*%……
    • 经常跟它一起出现的关键字是什么?
    • 应该是decltype吧?
    • 对,那智能指针了解吗?
    • 就是shared_ptr吗?
    • 对,为什么要用到智能指针呢?
    • 避免在忘记delete和发生异常时造成资源释放的问题,比普通指针安全性高一些……&¥#@%……
    • new/delete和malloc/free有什么区别
    • 前面这一对是C++提供的关键字,malloc和free是C提供的库函数,前面这个在用来创建类对象的时候会自动调用构造函数,后面的要自己手动计算需要分配的空间大小!@#¥%&*……
    • (小声地)嗯…不完全正确……那其他的一些新特性呢
    • 还有lambda表达式比较常用
    • 你一般在什么时候用lambda表达式呢
    • 主要是在写比较函数的时候,一些比较简单的比较函数如果只用一次,就不太适合专门写一个具名函数,容易污染命名空间,而且可读性也不会更高
    • 那lambda表达式有什么优缺点呢
    • 优点比较明显,写起来方便,不会污染命名空间等等,缺点就是如果函数比较复杂的时候可读性会比较低(用的比较少,一时也想不出很典型的优缺点…)
    • 用过强枚举类型吗
    • (我也是之后查了才知道这方面的内容,当时完全不知道这个,瞎猜可能是变体数据类型,菜哭)是variant吗?
    • (些许的尴尬…)那应该我们说的不是一个东西
    • const关键字你一般在什么情况下会用
    • 修饰函数参数或者函数本身,保证传入对象或者调用对象本身不会被修改,很多时候也用来代替某些宏定义,因为宏不提供编译检查,不够安全……
    • 对C++编译连接过程了解吗?(这里我重复了一下问题内容,可能语气显得有点不确定)对,就是gcc连接器这一类的,比较概念性的东西。我就是简单问一下看看你了解的程度。(我估计这应该就是看看个人对一项技术研究的深度吧)
    • (我简单答了一下CSAPP讲的那一套流程,没有太深入,不复述了,面试官的意思是了解到这个程度就差不多了,然而我心里明白要是说的很深入肯定能加分就是了…)
    • 构造函数可以是虚函数吗
    • 不可以,(虚函数表原理那一套)。不过如果一个类有虚函数,析构函数最好是虚函数
    • 初始化列表有哪些应用情景
    • (简单说了一下,初始化列表和构造函数体里的不同,其实不是很确定)
    • 那什么时候必须用初始化列表
    • 调用父类构造函数和const的成员变量的时候吧…(不确定…)
  • 【~40:00】下一步转战代码,加了面试官QQ,发来一个腾讯文档。(如果有不了解这个的,其实就是云同步的word文档,没有任何提示功能,你的每个按键操作对面都能同步看到)写代码过程中,面试官没有在听电话,只是在看你写代码(这种方式真特容易紧张导致大脑空白…)
    • 面试官口述了题目,输入一个日期和一个天数,返回这个天数之后的日期。
    • 当时第一感觉根本不像是个算法题,考察的就是各种临界情况,超麻烦…做的过程中发现自己连闰年怎么判断都忘了,还问的面试官,然后闰年的英语也不会写,用拼音写的,惭愧…
    • 代码就不贴了,最后的代码临界条件应该处理的还可以,但是当时实现的整体思路是按从年往下判断,导致处理完还要往回判断一趟,只能实现的算一般情况吧…
    • ∆第一次面试有点紧张,其实申完题目应该先说一下自己的理解和思路,看面试官给的反馈再做调整,既能侧面体现沟通理解能力,也可以借机避免一些错误的思路。但我是写了一会才想起这事,然后示意面试官说了一下思路,略尴尬…
  • 【~42:00】写完代码又回过头来询问关于数据结构方面的内容
    • 对数据结构方面了解吗
    • 基本的数据结构比较熟悉,像红黑树这种就只了解概念和使用场景了……(我真坦率…)
    • 对STL了解吗,STL是什么
    • 就是C++提供的一组比较高效的分别适用于各类场景的容器和容器适配器外加一组算法等等吧
    • 有那些容器
    • list vector deque map set multixx,在C11之后还有unordered map和set那几个
    • vector是怎样扩容的
    • vector维护一个capacity,如果当前size到了这个capacity的时候,就在内存中重新开辟一块是原来两倍大的连续空间,然后把之前的内容易到这边来……
  • 【~45:00】算法数据结构等等基础的内容就到这里,之后聊了一下关于游戏引擎等等岗位相关的内容
    • 你对unity游戏引擎了解到什么程度
    • (卑微而羞愧地)我现在觉得,就是用过的水平……(再次菜哭)
    • 嗯…那MonoBehaviour的生命周期是怎样的
    • (试探性瞎说)%@#¥@&*@……比较陌生了,印象中有这些
    • 碰撞器和触发器什么区别
    • (继续瞎说)
    • unity的垃圾回收你知道吗
    • (直接放弃)
    • (面试官听出了我这块知道的很少,开始转移话题)那矩阵运算你了解吗
    • 线代学过一些,还有点印象
    • 正交矩阵的逆矩阵怎么求
    • 我说我只记得一般矩阵通用的那种求逆过程了…
    • 面试官思索了一下,可能是发现我这几个方面都太菜了,没啥好问的了,表示今天就到这里吧……
  • 【~48:00】最后给了提问环节,我问了一个关于腾讯在市场导向方面的问题,其实也是因为国内和国外游戏市场的价值观差距太大了,一直也挺想了解的
  • P.S. 面完感觉已经凉了…除了C++好像没有答得上来的,显得学习领域很没有广度,但是面完过了一会一查居然状态是复试了……就当是人品了

二面

  • 二面除了开始简单的交流一下基本情况和意向之外,就是硬核的两道算法题,不贴代码了

    • 第一个:给一个长len的数组,让你删除里面最大的N个数,重复的数字算一个。len很大,N不大

      • 我的实现思路就是用一个最大堆,遍历一遍数组,都扔到堆里。然后从堆顶拿数,每拿出一个,都把后面跟着的重复的删掉,直到拿出N个数,然后遍历一遍数组把符合的删掉,把后面的往前挪
      • 面完之后自己反思了一下思路,又跟大佬交流了一下,有这么几个问题,最基本的至少应该倒着扫描,这样不会重复挪很多次后面的部分,其次堆应该大小够用就行,毕竟len很长,等于多了一份拷贝,空间效率不够高
    • 第二个:n个桶n个球,序号都是1~n,每个桶只能放一个球,放的球的序号跟桶的序号不能一样,一共有多少种放的方式
      • 稍一思考就能发现是个数学问题,找到通项就能很简单写出递归,至于能不能再改成循环来提高效率再另说
      • 但是尴尬的是我脑回路跟正常人有点不一样,所以我的递归思路有点偏门,还挺绕。刚开始代码写了一段时间之后,面试官打字提示我我的递归参数有个没有意义。其实那个参数在我的思路里是有意义的,但是面试官以为我是正常人的递归思路,所以好心给了一个提示。却不知道这个提示让我非常慌,思路整个都有点乱了……好在之后花了几分钟冷静下来,还是按照自己的思路写通了。最后给面试官讲了一下,他可能也没听过这种思路,所以还挺感兴趣的,而且至少能证明我是独立思考出来的……就结果来说也算是中规中矩了
  • 二面完之后还给我留了一道题,可能是觉得我这两道题做的还可以,想进一步考察一下。
    • 题目是考官自己出的概念,叫格式化树,反正我之后查是没有查到相关概念了。具体的定义我也记不太清了,大概有这么几点:格式化树是用来输出显示的,是对普通的树进行一系列规整得到的,同一节点的子节点之间的距离要相同,父节点要在所有子节点的中间,相同深度的节点所在的高度要相同,要求整个树所占面积尽量小。
    • 题目的需求不是特别明确,要求也很open,面试官的意思是尽量写,当天晚上之前把代码发过去,什么程度不做要求。
    • 我根据自己的理解限制了一下需求,尽可能简单,但还是只能做到局部最优解,而且还采用了暴力枚举等等效率比较低的做法……只能说这类题目上下限确实很高,跟OJ那些有明确解和思路的算法题不一样,还是需要以后重点关注一下的
    • 贴一下代码吧,大概写了4个小时(可见水平很菜了……),可能参考意义不大,我甚至都没有测试过……
typedef struct {int id;//other data...vector<Node*> children; //the order of the sub nodes is exactly the shown order in picture
} Node;class Tree {private:Node* root;void format();//other functions...
};/*
* this implementation can only find local optimal solutions, assuming each step has no aftereffect (actually not)
* format the tree from the lowest level
* for each node, mapping to a deque,  which stores a pair of displacements relative to the node for the most left and right sub nodes for each sub level
* after formating all sub nodes of a node, use brutal force to compute the possible minimal gap with the deques of the sub nodes
* during the process, maintain the optimal permutation, after enumerate all the cases, compute the deque of the current node
* suppose :
* 1. nodes with the same depth must have the same y
* 2. the sub nodes of different nodes cannot be interlaced
* 3. the distance of every two sub nodes  of a single node must be the same
*/
void Tree::format()
{if (root == nullptr)return;//post order traversal of the treestack< pair<Node*, int> > stackOfNodes; //int element is used to record the times of encountering the nodeunordered_map<Node*, deque<pair<int, int>>> subLevelDis; //the pair of two ints records the left and the right displacement * 2 of the level relative to its parentstackOfNodes.push(make_pair(root, 1));while (!stackOfNodes.empty()){Node* curNode = stackOfNodes.top().first;int cnt = stackOfNodes.top().second;switch (cnt){case 1://the sub nodes of the current node havent been formatted yetstackOfNodes.top().second = 2;//push the sub nodes to stack in the reverse node such that the first child is on the topfor (auto it = curNode->children.rbegin(); it != curNode->children.rend(); ++it){stackOfNodes.push(make_pair(*it, 1));}break; //end case1case 2://the sub nodes of the current node have been formattedstackOfNodes.pop();//format the order of sub nodes of the current nodevector<Node*>& childrens = curNode->children;if (!childrens.empty()){int cntOfChildren = childrens.size();vector<int> permutation(cntOfChildren); //the permutation of the index of the sub nodesfor (int i = 0; i < cntOfChildren; ++i)permutation[i] = i;int minMaxGap = INT_MAX;vector<int> minMaxPermutation(cntOfChildren);//use brutal force to check each permutation//for each permutation, find the max gapdo{int maxGap = 0;//compute the gap between each two adjacent nodefor (int i = 0; i < cntOfChildren - 1; ++i){int tempMaxGap = 0;auto& deque1 = subLevelDis[childrens[permutation[i]]];auto& deque2 = subLevelDis[childrens[permutation[i+1]]];int minLen = min(deque1.size(), deque2.size());auto it1 = deque1.begin(), it2 = deque2.begin();for (int i = 0; i < minLen; ++i, ++it1, ++it2){tempMaxGap = it1->second - it2->first;maxGap = max(maxGap, tempMaxGap);}}if (maxGap < minMaxGap){minMaxGap = maxGap;minMaxPermutation.assign(permutation.begin(), permutation.end());}} while (next_permutation(permutation.begin(), permutation.end()));//reorder the subnodes according to the indice in minMaxPermutationvector<Node*> tempChildrens(childrens.begin(), childrens.end());for (int i = 0; i < cntOfChildren; ++i){childrens[i] = tempChildrens[minMaxPermutation[i]];}//compute the level displacements of the current node and bind to the nodevector<int> maxLens(cntOfChildren);int maxLen = 0;for (int i = 0; i < cntOfChildren; ++i){maxLens[i] = subLevelDis[childrens[i]].size();maxLen = max(maxLen, maxLens[i]);}//for each level, find the index of the most left and right node, then compute the displacementdeque<pair<int, int>> dis;//if all the sub nodes of current node if (dis.empty())dis.push_back(make_pair(-cntOfChildren * minMaxGap, cntOfChildren * minMaxGap));//otherwisefor (int i = 0; i < maxLen; ++i){int left = 0, right = cntOfChildren;while (maxLens[left] < i)++left;while (maxLens[right] < i)--right;int leftDis = subLevelDis[childrens[left]][i].first * 2 + (left * 2 - cntOfChildren) * minMaxGap;int rightDis = subLevelDis[childrens[right]][i].second * 2 + (right * 2 - cntOfChildren) * minMaxGap;dis.push_back(make_pair(leftDis, rightDis));}subLevelDis[curNode] = dis;//free the memory space for level displacements of the sub nodesfor (int i = 0; i < cntOfChildren; ++i)subLevelDis.erase(childrens[i]);}break; //end case2} //end switch}
}

后记

  • 尽管到现在还没有出结果,但是面试过程中暴露的问题已经足够有意义了。下一步,大方向上还是按照自己原本规划的推进,具体执行过程就需要根据这些问题加以侧重了。
  • 这学期到现在为止都没有投过简历了,大四之前可能也不再投了,先看看这次面试的结果吧。
  • 愿大家都能拿到喜欢的学校或公司的Offer!

2019.3.28

Reeker

腾讯互娱面经-游戏客户端开发相关推荐

  1. 腾讯游戏客户端开发网易互娱暑期实习面经

    腾讯提前批(二面挂) 在打算笔试的下午,收到了一面电话通知,周一去腾讯上海大厦现场面试,于是提前批的笔试就没有参加(这可能有点影响) 腾讯一面 和面试官约了时间,结果到了腾讯大厦楼下没法进去,所以只能 ...

  2. 【大咖有约】腾讯互娱康中良:游戏云存储-TRedis高性能缓存及持久化

    腾讯互娱高级DBA康中良先生将作为DTCC 2016中国数据库技术大会特邀嘉宾出席.并将于5月12日大会"NoSQL技术实践"专场分享题为<游戏云存储-TRedis高性能缓存 ...

  3. 2020.3网易互娱游戏客户端开发面试

    2020.3网易互娱游戏客户端开发面试 视频面试 视频面试 首先先问了项目的情况,主要做了哪方面功能,面试之前一定要回忆清楚,会问的比较仔细. 问了UI框架,MVC原理,事件消息机制怎么实现.(回答的 ...

  4. 腾讯互娱技术总监张正:《天涯明月刀》后台技术创新

    9月23日,首届"梦想·匠心"腾讯游戏开发者大会于深圳举行,在技术分论坛上,腾讯互动娱乐<天涯明月刀>项目技术总监张正分享了<天涯明月刀>的后台技术创新.拥 ...

  5. 互动娱乐成互联网新战场 腾讯互娱走向前台 阿里小米忙布局

    行业嗅觉敏锐的人或许已经发现,近段时间有关互联网巨头布局游戏.文化等产业的消息越来越多.腾讯游戏官方微博于18日透露,将在4月举办UP2014腾讯互动娱乐年度发布会,腾讯互娱潜心布局十年将正式从幕后走 ...

  6. 腾讯光子游戏客户端开发公开课以及实习生面试凉经

    腾讯光子游戏客户端开发公开课以及实习生面试凉经 第一次和大厂打交道,浅浅记录一下吧 公开课笔试 因为是大二下报名参加了腾讯游戏开发公开课,所以当时递完简历之后还需要笔试一下,是在牛客网进行的笔试,时间 ...

  7. 网易互娱2018校招游戏研发工程师在线笔试

    如果题目版权限制,不能发表该题解,请私信,我会立刻删除博客. 题目描述 注意:本题只允许使用C/C++或Java进行解答,其他编程语言提交均视作无效处理. 小W有一个电子时钟用于显示时间,显示的格式为 ...

  8. 腾讯游戏客户端开发面试

    碎碎念----第一次腾讯游戏客户端开发面试   作为一个本科.研究生专业都跟计算机不沾边的学生,简历被通过筛选本来就应该是最好的结果了,然而自己还是抱着一点点的期望,万一自己就通过了所有面试,进入腾讯 ...

  9. 微信小游戏客户端开发环境搭建

    微信小游戏客户端开发环境搭建 开发工具 环境配置 发布小游戏 一直以来,弄App形式的游戏比较多,近年来,微信小游戏火了起来.出于好奇,研究了一番,觉得还是挺有意思的,想和大家分享下. 官方手册网址: ...

  10. 【游戏开发面经】我在阿里HRG面这关跪掉了,游戏客户端开发岗,总结一下(阿里 | 游戏 | 凉面面经)

    文章目录 一.前言 二.流程 1.简历 2.一面,技术面 2.1.技术题 2.2.常规题 2.3.面试结果 3.二面,技术面 3.1.技术题 3.2.常规题 3.3.面试结果 4.三面,HRG面 4. ...

最新文章

  1. Activity的知识
  2. 嘉兴新型智慧城市建设带来的三个问号
  3. VMware 没网线 虚拟机和主机互联
  4. 全球及中国有色金属行业未来发展走势与投资机遇研究报告2022版
  5. Effective STL 条款30
  6. python对象模型映射_看例子,学 Python(三)
  7. 话里话外:猎人讲小事——兔子、凤凰与猎狗
  8. 4种方法帮你解决IntelliJ IDEA控制台中文乱码问题
  9. 【bzoj 3252】攻略
  10. iOS从零开始,使用Swift:UIKit的第一步
  11. pythonurllib新浪微博_定向爬虫 - Python模拟新浪微博登录
  12. Ubuntu安装Gcc时,显示“无法解析域名cn.archive.ubuntu.com”,如下方式可解决
  13. 名帖121 文徵明 小楷《琴赋》
  14. Web测试如何让IT门外汉更好的入门篇
  15. 计算机a类论文有哪些,a类核心期刊有哪些
  16. 我为什么坚信光触媒的未来?
  17. 【H.264/AVC视频编解码技术详解】八、 熵编码算法(2):H.264中的熵编码基本方法、指数哥伦布编码
  18. python输出给定字符串中字母a出现的次数_[Python] 输出a字符串出现频率最高的字母,用到了list中的排序和Iambda...
  19. python输入直角三角形a、b、输出斜边c_编写Python程序,从键盘输入直角三角形两直角边a,b,求斜边c,并输出....
  20. 技术控,看这里,一款支持断点调试的数据科学工具

热门文章

  1. java 葫芦娃.rmvb,课内资源 - 基于JAVA的葫芦娃 — 最终之战
  2. C语言解析FLM(ELF)格式文件
  3. Ubuntu快速安装或更新chrome
  4. Google搜索打不开解决办法、Chrome小技巧
  5. [数据分析笔记] 网易云歌单分析系列01—爬取网易云歌单信息
  6. php plupload上传失败,PHP-plupload错误生成
  7. Python招聘职位大体是两个方向
  8. 外星人笔记本计算机在哪里,笔记本电脑没声音,教您外星人笔记本没声音如何解决...
  9. 非对称TSP问题(asymmetric travelling salesman problem)与对称TSP问题的转换
  10. 仙境传说 第一章之四 卢渊*梦魇过后的情缘