昨天面了网易互娱的游戏研发工程师,回想下彷佛问的问题并很少,总体也就 5 个问题,但每一个问题展开以后里面的量好像也很多,如今整理一下,顺便解决下面试中没答上来的地方。python
先是自我介绍。。。。。面试官了解到我对 Python 更加熟悉一些,因而问了比较多的 Python 相关的问题。ios
面试官:在 C++、Java中,定义一个类,其成员能够申明为 public、private、protected, 那么在Python 中如何实现类成员的 public、private、protected
答:Python 语言并不存在控制访问,因此没法直接定义类成员的 pubilc、private等属性,通常状况下是经过命名规约来达到这个效果,对于 private 的成员,通常命名以 _
开头,而 public 的则正常命名便可。c++
面试官:那对于双下划线__
开头的成员呢?web
答:双下划线开头的成员感受主要是用在类的继承的时候,若是不想子类直接访问到父类的这个成员,则能够以双下滑线开头。(修正,不只仅是继承的时候,在该类中定义了双下划线开头的成员,实例化的对象也没法直接访问该成员)面试
面试官:若是我访问了这个双下划线开头的成员,会报什么错误?算法
这里我忽然就愣住了,由于以前都没去尝试过,愣了一下子以后,面试官给了些提示,若是你访问一个变量,但这个变量没有定义的话,那会报什么错误?后端
答:应该是变量不存在吧数组
面试官:那上面那个问题是报什么错误呢?数据结构
答:这么一说感受应该是变量不存在机器学习
面试官:那再问问若是我非要访问这个双下滑线开头的成员,要怎么作?
这里真就不会了 orz
如今来补一下
''' @Description: @Author: 妄想 @Date: 2020-05-29 15:28:30 @LastEditTime: 2020-05-29 15:32:52 @LastEditors: 妄想 ''' class base: def __init__(self): self.public = 1 self._internal = 2 self.__private = 3 def public_method(self): print('public method') def _internal_method(self): print('internal method') def __private_method(self): print('private method') b = base() print(b.public) print(b._internal) print(b.__private)
运行一下
那我该如何访问它呢?查了下资料,发现双下划线开头的成员,会被重命名,变成 _类名
+ 成员名,在这里就是b._base__private
print(b.public) print(b._internal) print(b._base__private)
函数也是相似
面试官:了解过修饰器吗?
答:了解过
面试官:介绍下 Python 中修饰器(问题大概就是这个意思吧)
答:balabalabala。。。。(大体意思就是减小代码重复,封装成装饰器方便使用,相似于函数)
面试官:那一个装饰器的输入和输出是什么呢?
答:输入?能够是任意的参数吧,这个不是根据实际定义的吗?(这里我理解错了面试官的意思了- - ,由于以前在作 web 后端的时候,用了修饰器来作 token 验证,当时将 token 做为一个参数使用了)后面在面试官的引导下,反应过来了,输入和输出都是函数。
面试官:若是我不采用 @修饰器名称 的方式来调用修饰器,那该怎么作?
答:我印象中是直接当作函数调用就行了,可是好像并没成功 orz 。。
先来个通常写法
def foo(f): def inner(): print('inner') return f return inner @foo def bar(): pass bar()
会发现输出了 inner,而后我当时写了这样的调用
def foo(f): def inner(): print('inner') return f return inner def bar(): pass foo(bar)
发现没输出 orz, 而后就过去了,后来仔细想一想,虽然说返回的是函数,但只是这个函数名啊,我并无调用它哪来的输出啊,菜哭。。
改为这样就行了
bar = foo(bar) bar() # 或 foo(bar)()
面试官:了解过迭代器吗?能够介绍下吗?
答:迭代器通常是用在对 Python 中的数据结构进行遍历,好比我如今有一个名为 li 的 List,我想对里面每一个元素进行修改,那就须要遍历每一个元素,这时经过 for number in li:
这条语句,便会生成一个迭代器,而后 number 为当前所在位置的元素。
面试官:那这跟直接索引遍历相比的好处是什么?
答:(这里凭感受答的,也不清楚对不对)1. 按索引遍历的话首先须要知道这个数据结构的长度。2. 每次遍历的时候都须要经过索引来获取这个数据,而经过迭代器可直接获取到数据。
面试官:那有没有什么状况下是不能使用迭代器的呢?
答:这里我以为存在删除操做的时候应该是不能使用迭代器的,以下面这段代码, 我想删除列表中大于 3 的元素
li = [1, 2, 3, 4, 5, 1, 4] for i in li: if i > 3: li.remove(i) print(li)
输出一下发现结果为 [1, 2, 3, 5, 1]
面试官:那添加的时候呢?
答:添加的状况没遇到过,不太清楚,但感受应该也不太行。(我的感受,通常来讲添加是须要知足某种状况才进行添加,可是在迭代过程当中进行添加,会致使迭代器需迭代的元素不断增长,若是操做不当可能会陷入死循环)。
本觉得结构体对齐很简单的,然而。。我天真了 - -
面试官:那接下来问问 C++ 方面的内容,了解过结构体的对齐吗?
答:了解过, balabalabala。。。。
面试官:那来算一下这个结构体的大小吧
struct Node { short a; long b; char c; char d; int e; int f; short i; short j; long k; };
答:(算就算吧),算了一下子,算出来一个 34 字节
面试官:怎么得出来的
答:首先 short 占 2 字节, 而后 long 占 8 字节, 后面加起来总共是 22 字节,对齐一下就是 24 字节,加起来总共 34 字节。(后来验证了下,发现本身错了 orz)
面试官:你肯定这里第一个 short 只占 2 字节吗?
答:balabalabala。。。(我还以为本身很对,后来下来验证了下发现本身打错了 orz)
面试官:这里操做系统是怎么读取数据的?一次能读两个字节吗?
答:(这里我已经懵逼了)emmmmm。。。不太清楚。。我记得这里应该是读取一个起始位置 + 偏移量来获取这个数据。
面试官:下去以后有兴趣再去了解了解吧
这里开始补充,发现 mingw64 long只占 4 个字节???
/* * @Description: * @Author: 妄想 * @Date: 2020-05-29 16:42:59 * @LastEditTime: 2020-05-29 16:54:49 * @LastEditors: 妄想 */ #include<iostream> #include<stdio.h> using namespace std; struct Node { short a; long long b; char c; char d; int e; int f; short i; short j; long long k; }; // 2 + 8 + 22 // 34 int main(){ printf("%d\n", sizeof(Node)); printf("%d %d %d %d %d %d %d %d %d\n", &Node::a, &Node::b, &Node::c, &Node::d, &Node::e, &Node::f, &Node::i, &Node::j, &Node::k); printf("char:%d, short:%d, int:%d, long:%d, long long:%d\n", sizeof(char), sizeof(short), sizeof(int), sizeof(long), sizeof(long long)); return 0; }
看一下输出
这个 long 只占 4 字节有点迷,没办法,就先改为 long long 吧。
能够发现,变量 b 的起始位置是 8 而不是 2,e 的起始位置是 20 而不是 18。
查了下相关博客:
面试官:接下来问问算法方面的东西吧,说一说快排的流程。
答:(很尴尬。。。已经好久没有接触过排序算法了,近期准备面试也没看过排序方面的东西,因此想了一段时间,好歹仍是想起来了) balabalabala。。。。
面试官:那时间复杂度呢?
答:最差 \(O(n^2)\) ,平均 \(O(n\log n)\)
面试官:什么状况下最差呢?
答:数组彻底逆序排序的时候
面试官:那怎么选取主元能使得快排的性能最好呢?
答:(这个以前在算法导论上看到过,然而已经忘了。。。想了想,若是说每次划分正好在数组的正中间,那么可达一个较优的状况因此就答了中位数)
面试官:那再问问其余问题,有了解过其余最差状况不会像快排这样的排序算法吗?
答:(这里感受面试官问的应该是稳定的排序算法有哪些,当时能想起来的就是归并排序结果一不当心答成分治排序 - -)
补充:从别的地方拿来的图
写了道链表翻转,结果很尴尬,忘了将翻转后的链表最后一个元素的 next 设置为空,致使一直超时 orz 。。。。。过程当中边 debug 边跟面试官讨论,最后改出来了。。害,过久没手写过数据结构了,这么一道简单的题还写出 bug。。。哭了
问了下想到网易作游戏开发须要学些什么(毕竟当年是想作游戏开发才选的计算机,并且大一刚入学的目标就是网易游戏,虽而后来搞了近两年机器学习。。),面试官说是并无太期望应届生有游戏开发相关的知识,要求就是基础要扎实,可以作到他们交给咱们的东西咱们能学会。(不说了,接着补基础去了。。。)
一次体验极好的面试,总共面了一个小时多一点,过程当中有答不上来的地方面试官会慢慢引导本身,结束以后感受好像答的还不错,梳理一下发现问题仍是有点多 orz。。面试以前看了很多网易游戏研发的面经,照着面经准备了几天,发现被问到的面经上都没出现,真就全靠平时积累。。。看来还有好多地方须要补一补。。说是一周内会出结果,只能看命了。。
从三月份开始投算法岗,一直到以前改投开发岗,挂了无数次,看着周围一些同窗都拿了很多 offer,压力有点大。。