前几天面试了网易的一个游戏开发岗位,面试官问了几个问题,简单整理一下。
先是对着简历简单的问了一下在校经历,接着对简历上的项目进行了一下提问,虽然发挥的不好,还是再总结一下吧
1.MySQL常用的有那些引擎,MyISAM和innodb区别
MyISAM,InooDB,Memory
myisam | innodb |
---|---|
不支持事务 | 支持事务 |
插入为主 | 频繁修改 |
不支持外键 | 支持外键 |
支持全文检索 | 不支持全文检索 |
保存行数 | 不保存行数 |
支持表锁 | 支持行锁 |
非聚集索引 | 聚集索引 |
可以热备份 | |
有缓冲池,可缓存数据和索引,加快查询速度 | |
为处理巨大数据量的最大性能设计 |
- 对于自增长的字段,innodb中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引
- 清空整个表时,innodb是一行一行的删除,效率非常慢。MyISAM则会重建表
2.如何选择数据库引擎
- 支持事务选innodb,否则选MyISAM
- 查询多为只读选择myisam,有读有写选择innodb
- 系统崩溃后myisam恢复困难
- MySQL5.5以后innodb已经成为默认引擎,不知道选啥就用它
3.爬虫爬取的目标网站,怎么实现的
先是爬取页面抓取数据,后来感觉效率太低于是分析页面结构,找到了他的数据接口,直接从接口爬取数据
如何找的数据接口呢?
打开网页之后,打开浏览器的开发者模式,在网络请求里过滤一下,XHR是网页的ajax请求,找一下请求头的链接,分析一下参数的构造就可以了
4.设计模式
1.单例模式:这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
- 1、单例类只能有一个实例。
- 2、单例类必须自己创建自己的唯一实例。
- 3、单例类必须给所有其他对象提供这一实例。
2.工厂模式:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
让其子类实现工厂接口,返回的也是一个抽象的产品。
3.MVC模式:
Model-View-Controller模式
Model:模型代表一个存取数据的对象。(数据库对象)
View:视图代表模型包含的数据的可视化。(页面显示)
Controller:控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。(业务逻辑)
4.MTV模式:
同MVC模式,MTV是Django下的MVC设计模式,只是换了个叫法
前后端分离,松耦合
…
5.寻路算法
A*寻路算法,他可以认为是Dijkstra算法的拓展,由于借助启发函数的引导,A*算法通常有较好的性能。
原理较复杂,没答出来
6.unity状态机Animator
Unity可以用两种方式控制动画
-
Animations,这种方式简单,直接 Play(“Idle”) 或者 CorssFade(“Idle”) 就可以播放动画
-
Animator,5.x之后推荐使用这种方式,因为里面可以加上混合动画,让动画切换更加平滑
animator的使用
- 导入模型和动作,做成预制件perfab
- 将模型的骨骼结构转换成unity中的对应的结构,比如人型的转换成humanoid
- 添加状态机控制器
- 编辑状态机控制器,切换动画播放的顺序
- 代码中控制动画播放的状态
7.Python分割字符串:
给定“I love guangzhou”,要求return[‘guangzhou’,‘love’,‘I’]
str='I love guangzhou'
def reverse(str):
return str.split(' ')[::-1];
然后面试官说不能使用函数。。。手写split函数
def split(str,cut):
str=str+cut;
l=len(str);
p=0;
res=[]
for i in range(l):
if str[i]==cut:
res.append(str[p:i]);
p=i+1;
return res;
if __name__=='__main__':
str='I love guangzhou'
s=split(str,' ');
print(s);
print(s[::-1])
8.Python删除列表里>=2且<=4的元素
list=[1,2,3,4,5,6,7,8,9]
list=[1,5,6,7,8,9]
def deleteNum(list):
for num in list:
if num<2 or num>4:
print(num);
if __name__=='__main__':
list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
deleteNum(list);
然而面试官说不让使用第二个列表那就不会了。。。
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
l=list(filter(lambda x:x<2 or x>4,list1))
# python3.*之后filter函数返回的不再是列表而是迭代器,所以需要用list转换。
print(l);
然而回来一查,果然我是个菜狗
题目都很简单,回答的却很烂,我真是个辣鸡,散会
最后总结一下查资料时找到的知识点:
python中的filter、map、reduce用法总结:
filter的功能是过滤掉序列中不符合函数条件的元素,当序列中要删减的元素可以用某些函数描述时,就应该想起filter函数。
x = [1,2,3,4,5]
list(filter(lambda x:x%2==0,x))
# 找出偶数。python3.*之后filter函数返回的不再是列表而是迭代器,所以需要用list转换。
# 输出:
[2, 4]
求一个序列或者多个序列进行函数映射之后的值,就该想到map这个函数,它是python自带的函数,在python3.*之后返回的是迭代器,同filter,需要进行列表转换
x = [1,2,3,4,5]
y = [2,3,4,5,6]
list(map(lambda x,y:(x*y)+2,x,y))
# 输出:
[4, 8, 14, 22, 32]
对一个序列进行压缩运算,得到一个值。但是reduce在python2的时候是内置函数,到了python3移到了functools模块,所以使用之前需要 from functools import reduce
from functools import reduce
y = [2,3,4,5,6]
reduce(lambda x,y: x + y,y) # 直接返回一个值
#输出:
20
from functools import reduce
y = [2,3,4,5,6]
a=reduce(lambda x,y: x + y,y) # 直接返回一个值
print(a)
def add(x,y):
return x+y
sum1=reduce(add,[1,2,3,4,5]);
sum2=reduce(lambda x,y:x+y,[1,2,3,4,5])
print(sum2,sum1)
#输出:
15 15