完美一面
岗位是C++客户端,一面好久没消息了,估计是凉了。。。
总共半个小时,但是强度很高,问了30多个问题,问的基本是C++。
1.知道堆排序吗,具体是怎么实现的
讲了讲堆的性质、问道具体实现(如何建树、插入)没说清楚。
建堆:首先堆可以是一个数组,但是有着完全二叉树的性质,当节点下标为index的时候,左子树下标为index * 2 + 1,右子树下标为index * 2 + 2,这样我们可以从第一个非叶子节点(下标为 len / 2 - 1)开始调整数组结构构成大顶堆,首先将这个节点与其叶子节点进行比较,如果叶子节点比它大,找出最大那个节点与它交换,之后对该位置进行同样的调整以防一次调整无法满足堆。然后从len / 2 – 1这个位置一直向后做同样的操作。
排序:依次将堆顶与最后一个节点交换,最后一个节点不包括交换过的节点,然后重新对堆顶位置调整堆,直到所有节点都交换完成,排序完成。
2.如何不改变链表结构逆序遍历链表
通过使用stack,将每次遍历的结果保存到栈中,之后依次取栈顶输出,并出栈
追问:如果不开辟新的内存空间呢?
没想出来,后面面试官提示说递归
依次递归listNode->next,之后进行输出返回(可我寻思着这个递归栈也要内存空间啊)
3.链表过长会出现什么问题?
查找效率降低
可能会出现栈溢出、难以维护等问题
4.讲一讲面向对象编程
封装、继承、多态
5.讲一讲多态
编译时多态、运行时多态
6.讲一讲虚函数机制
虚函数表、虚函数指针
7.类里面的默认函数有什么
构造函数、析构函数
还有拷贝构造函数和赋值运算符“=”
8.如何阻止编译器自动创建默认构造函数
自己写一个构造函数
追问:还有没有别的方法?
没答上来,C++11新特性关键字delete实现, MyClass() = delete;
9.子类构造函数调用的顺序
先父类后子类,析构反过来
10.析构是不是虚函数
没答上来
面试官提示:继承后释放内存会不会出现什么问题?
可能会继承相同的变量导致重复释放内存导致程序崩溃。
可以是虚函数,如果父类不定义析构函数为虚函数,在使用父类指针创建子类对象时,在delete的时候调用的析构函数会出错,会调用父类的析构而不会调用子类的析构函数。
11.构造函数里面可以调用虚函数吗
没答上来
可以但是不推荐,比如说父类和子类都有相同的虚函数,并且都在构造函数中调用了这个虚函数,在实例化子类的对象时会出现问题,实例化会先调用父类的构造函数,此时子类对象还未创建,调用虚函数为父类的虚函数而不是子类的虚函数,然后才构建子类调用子类的虚函数。
12.类的所有实例如何共享数据
使用静态成员变量
13.静态成员变量会不会影响类的大小
不会,它存在静态区
14.New和malloc的区别
New会同时申请内存和调用构造函数,而malloc只申请内存
15.New的返回的类型是什么
返回的是一个指针,会根据你接收这个指针的类型返回不同类型的指针。
16.内存分配失败会发生什么
程序崩溃,触发内存分配失败的异常。
17.讲讲内联函数
内联函数会在调用的时候讲函数体的代码复制到该位置,如果多次调用可能会导致编译器多次编译相同的代码,如果代码过长会比较影响效率
18.内联函数和宏的区别
内联函数的类型是安全的,它会进行类型检查,而宏不会,并不安全。
调试信息内联函数出错时会出现在出错的位置,而宏则会出现在定义的位置。
内联函数有明确的作用域,而宏是全局的。
编译器可以选择是否内联该方法,而没有权利控制宏。
19.有了解右值吗
有,但是用的比较少
比如通过使用右值引用,它可以将一个大型的数据结构进行权限的交接,而且不用开辟新的内存,效率较高,适合用于新的对象的创建,且不需要再使用旧对象的情况。
20.模板中的双取址符是右值引用吗
不是,是一种万能引用,可以用来接受右值引用,也可以接受左值引用
21.讲讲stl
是一类标准模板库,可以使用已经写好的容器,比如vector、list、map等等
22.Stl除了容器还有别的东西吗?
有,还会有一些算法像是sort这种
算法、迭代器、智能指针等等
23.讲讲vector和list
Vector的内存连续,可以通过下标快速定位数据,尾插速度快
List的内存不联系,定位较慢,但是插入操作很快
24.Vector和list那个插入速度比较快
List的插入比较快,vector如果是在数组尾部插入会更快一点
25.Vector插入数据后现有的迭代器会不会有影响
如果没有超过容量不会,如果超过了可能会重新分配内存导致迭代器失效
追问:如果迭代器指向第三个数据,在第二个位置插入数据,迭代器会不会有影响
有,但是没答上原因(应该是插入会导致vector重新分配内存,因为它内存连续,后面的数都需要往后挪,导致迭代器失效)
26.判断链表有没有环
用双指针,设置快慢指针,遍历判断有没有相交
27.如何寻找环的入口
通过快慢指针遍历,比如快指针一次走两步,慢指针一次走一步,在相交后拿一个头指针,开始与快指针同时遍历,当两个指针相交的时候就是环的入口。(这里答错了,应该是和慢指针相交为环的入口)
28.计算机如何计算一段算式
通过后波兰表达式,通过栈实现(细节没答清楚)
首先将中缀表达式转化为逆波兰表达式,转化时准备一个字符串数组和一个栈,过程遍历输入的字符串,为如果为数字则直接加入结果数组,如果为计算符则比较栈顶计算符,如果优先级大于栈顶运算符则直接入栈,否则将栈顶之后所有大于等于该运算符优先级的运算符加入结果数组。在遍历完后将栈中所有运算符保存在结果数组中。
然后进行计算,准备一个栈,遍历逆波兰表达式,如果为数字则入栈,如果为运算符计算栈中顶部两个数字,然后将两个数字出栈将结果入栈,依次类推,最后栈中留下一个计算结果。
29.二维数组按行遍历快还是按列遍历快
按行遍历,数组的内存是连续,所以按行更快
30.讲一讲进程和线程
31.线程共享哪些资源
32.讲一讲TCP和UDP
33.TCP是如何建立连接
反问:
这个岗位后续是用纯C++做开发还是用游戏引擎?
答:用的ue
你对这个行业发展的一些看法
答:这个行业的技术力还是很强的,虽然最近有版号的问题,但是我认为这个行业的发展还是不错的
游戏行业的新技术从哪里学习
答:游戏开发者大会(GDC),上面的技术还是比较前沿的
游戏项目的工作计划是如何安排
答:一般比较看经验
#我的实习求职记录#