腾讯游戏一面回忆

33 篇文章 0 订阅

来美国也有一个多月了,但现在正值各大企业秋季招聘时间,所以时间也是挺尴尬的。前段时间腾讯校招笔试在中国时间晚上19:00举行,我只能早上6点起来做题目。腾讯笔试我做的很快,但是证明结果并不太好,于是在美国时间的23号收到面试通知,当然去不了当场面试,于是想看可不可以远程面试。找在腾讯工作的同学朋友问了一圈,希望不大,于是就没有抱多大希望。24号还去玩了一整天,拖着疲惫的身躯回到住处,没想到在24号凌晨1点左右收到了hr的电话,问我在哪儿了,为什么还不去面试。。。

然后几经周折和面试官联系上,因为是凌晨,我想申请可不可能更换面试时间,面试官的答复是:如果现在不面试就失去这个机会了。于是硬着头皮上了。。。

一、自我介绍

面试官:我想确认一下你想不想做游戏?

我:喜欢游戏,之前在实习内推的时候我就参加过腾讯游戏的面试,但是跪在了第三面,感觉很可惜。。。

面试官:你面试的是什么部门,觉得为什么会挂呢?

我:我面试的是欢乐斗地主团队,当时面试官问的内容挺好,比较基础,涉及到很多c++编译器如何实现断点功能等问题,当时还是基础不够扎实,所以没有答出来。。。

面试官:知道了,那么请自我介绍一下吧

然后我主要介绍了我用c++比较多,近期完成的项目是lego可视化机器人项目,参加了一些比赛,然后去阿里蚂蚁金服实习了2个月,但是是java开发。。。

二、谈谈纯虚函数

面试官:既然你用c++比较多,那么请说一下纯虚函数吧

我:纯虚函数会在函数后面加 =0,且没有实现;含有纯虚函数的类不能被实例化;纯虚函数是为了c++多态而引入的,而多态是c++一个非常重要的性质。。。

很显然,我答得并不完全。虽然找理由是不对的,但是客观原因还是在那儿—去实习用java,然后来美国学习更偏重于汇编和硬件,c++在近4个月用的很少,三天不用手生真的是不变的真理!!要勤加练习啊!!!

下面看看相对完整的答案:

定义

纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”。如:virtual void function()=0

注意点

定义一个函数为虚函数,不代表函数不被实现。
定义函数为虚函数,是为了允许用基类的指针来调用子类的这个函数。
定义一个函数为纯虚函数,才代表函数没有被实现。
定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。

引入原因

  1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。
  2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。
  为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。

纯虚函数的意义,让所有的类对象(主要是派生类对象)都可以执行纯虚函数的动作,但类无法为纯虚函数提供一个合理的缺省实现。所以类纯虚函数的声明就是在告诉子类的设计者,“你必须提供一个纯虚函数的实现,但我不知道你会怎样实现它”。

在这点上很想java中的接口,但是也略有不同,c++中没有接口的概念,但是可以用抽象类来模拟java中的接口。

详见:http://blog.csdn.net/hackbuteer1/article/details/7558868

另外关于概念层的接口与抽象类的区别,详见:http://blog.csdn.net/scythe666/article/details/51841161

三、谈谈c++函数const

我:const用于函数中,代表在该函数中不允许改动该类成员变量的值。

面试官:那如果我想改呢?

我:好像是有什么cast。。。是mutable。。。mutable可以暂时去掉const修饰的值的const属性,但是如果用的地方过多肯定是设计有不合理的地方。

其实是有一个const_cast的,但是他和mutable有区别

四、请问.obj文件是什么

我:obj是c++编译过程中的中间文件,对应于一个编译单元,一个编译单元的概念就是一个cpp文件层次包含所有头文件后的文件。

后来想想,这么说基本是对的,但是还是感觉不足。

目标文件,一般是程序编译后的【二进制文件】,再通过链接器和资源文件链接就成可执行文件或链接库。

OBJ只给出了程序的【相对地址】,而可执行文件是【绝对地址】。

编译:当前源代码编译成二进制目标文件(.obj文件)
链接(link):将生成的.obj文件与库文件.lib等文件链接,生成可执行文件(.exe文件)或链接库文件(.dll)。

一个现代编译器的主要工作流程如下:

源程序(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code)→连接器(链接器,Linker)→可执行程序(executables)

五、请问.pdb文件是什么

我:应该是项目调试所用到的文件,具体应该保存的是项目的调试信息吧

这个问题在腾讯游戏内推第三面的时候问道过,不知道是不是面试官看了我博客发现这个问题,可是我还是没有答好。。。。。。。

Native C++ PDB包含了如下的信息:
* public,private 和static函数地址;
* 全局变量的名字和地址;
* 参数和局部变量的名字和在堆栈的偏移量;
* class,structure 和数据的类型定义;
* Frame Pointer Omission 数据,用来在x86上的native堆栈的遍历;
* 源代码文件的名字和行数;

详见:http://www.cnblogs.com/itech/archive/2011/08/15/2136522.html
https://msdn.microsoft.com/zh-cn/library/aa292304(v=vs.71).aspx

六、用户态和内核态有什么区别

面试官:请问你对操作系统了解的多吗?

我:当时我们上过操作系统课,也上过UNIX环境高级编程,对操作系统有一定了解。

面试官:那么请你谈谈用户态和内核态有什么区别

我:用户态拥有权限较小,不能访问到很多资源,而内核态是操作系统内核使用时间片处理的那段时间的状态,拥有高权限,可以访问到很多资源,比如特定内存区域。

详见:http://www.cnblogs.com/vampirem/p/3157612.html

七、那么你对操作系统内存管理有什么了解吗

我:windows操作系统内存管理采用分页机制,也就是说我们编写程序所用到的内存都不是真正的物理内存,而是分页内存虚拟地址,操作系统会对物理内存和虚拟内存进行一个映射。

八、手写代码—链表反转

这个是很可惜的一个部分,我那个时候脑袋有点僵,听到这个很开心,因为肯定会,但是面试官让我在qq上直接打给他,有点手忙脚乱,于是我说:给我一点时间,我肯定可以写出来,但是我现在有点慌,可不可以说说思路呢,我说用3个指针一定可以写出,一个指向pre节点,一个是cur节点,一个是post节点。。。

但是毕竟还是没有写出。。。这么简单的都没有写出,感觉非常自责

ListNode* reverseList(ListNode* pHead) {

    ListNode* pReverseHead=NULL;
    ListNode* pNode=pHead;
    ListNode* pPrev=NULL;

    while(pNode){
        ListNode* next=pNode->m_next; //先保存当前被处理节点的下一个节点
        if(NULL==next){//原链表的最后一个节点
            pReverseHead=pNode;
            break;
        }

        pNode->m_next=pPrev;//该节点的前一个节点
        pPrev=pNode;
        pNode=next;
    }
    return pReverseHead;
}

九、说思路:如果有一个栈,有三个函数min(),push(),pop()如何都在O(1)时间内解决

这个问题相对来说,我有思路比较快,我说设置一个变量保存当前最小值,然后每次push进来的时候与这个值比较,如果小就替换。

但是我后来发现这样是有问题的,因为pop了可能吧最小的那个pop出去,这样第二小的变成最小了,所以这道题是需要保存一个队列的,当然这样就变成插入的时候需要同时用二分法插入到队列中。

十、如何得到一颗二叉树高度

我:用广度优先遍历

其实用广搜和深搜都应该可以完成任务,只需要每次在探测到一个节点的时候,判断是否有左孩子和右孩子,节点需要有一个属性标识层次,相应+1即可

十一、谈谈你接下来的学习计划

这个问题出来的时候我还以为问题都问完了,但是发现并不是。。。

我:打算还是打扎实基础,之前看了《TCP/IP卷》,打算再仔细看一遍,另外再仔细看一遍《Unix环境高级编程》。。。

面试官:你对图形了解吗

我:没有接触过很多3d知识(忘记说我本科是信息工程专业),但是在实验室做过一年图像处理,用opencv识别蒙面人。

十二、智力题。。。

说句实话,虽然我每次面试解智力题还挺不错,但是我个人认为这也是最考不出区分度的部分,但这次我没有做好。。。

面试官:有10升水装在杯子里,还有一个3升的杯子和一个7升杯子,请问如何实现5、5平分?

我:901一定可以实现,可以实现单位1就可以实现5、5分(这样肯定是不对的)

面试官:肯定没这么简单,尽量形成一个2

经过无限提示我还是搞出来了,但是很明显做的不好。。。

10L3L7L
1000
307
334
604
631
901
910
217
235
505

十三、尾声

然后面试官说:你的情况我们大致了解了

我跟面试官解释了一下,可能我太累,然后比较紧张,所以表现的不好。在这边多写的是汇编代码和学习硬件知识,所以还是需要多写写c++代码,不然有些知识很容易忘记。

再后来我做了一个性格测试。。。整个面试持续1个小时左右

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值