点击上方“CVer”,选择加"星标"或“置顶”
重磅干货,第一时间送达
作者:13亿中的一挫
https://www.nowcoder.com/discuss/231656
本文已由作者授权,未经允许,不得二次转载
可能字数比较多,大家多担待,编程语言是Python和C++
一开始投的很少,但是后面被洗脑海投,一晚上投了11家公司吧,真的是海投一时爽,一天面两场(甚至三场),然后从8月25号开始天天笔试面试,我只能把时间都定在中午1点保障不冲突。。
公司包括:寒武纪、腾讯、作业帮、拼多多、蘑菇街、网易互娱
其他几天后才有的面试经验 360一面 网易有道一面 蘑菇街三面等之后面完在更新
HR面的内容包括公司平时情况就不分享了
寒武纪2019.7.16
因为寒武纪来了学校,所以参加了现场笔试(笔试成绩应该很高,因为全会做,花了一半时间交卷了,基本是一些C++的基础题,除了有一个没听过的名词没写出来,都写出来了)
面试体验比较差了,从此开始补习后端知识,包括计算机网络(面试还没问过) C++(偶尔问) 操作系统(偶尔问,但是深入理解计算机系统这本书真的是好,深深为这本书着迷了,我觉得就算不为面试也得好好看看)
2019.7.16一面:电话面 全程打断buff
1、自我介绍
2、Python和C++的区别(答了很多python的特性)
3、Python为什么会慢?
答:因为不知道数据类型,取数据要判断一下
(1、python是一个动态的解释型语言;python中的值不是存储在缓存区而是分散的存储在对象中
2、Python是一门解释器语言,和c,java不同,C,java都是编译语言,也就是说写完Java程序首先要编译源程序,生成可执行文件一个class文件,而Python写完程序,提交到解释器,解释器会立刻将第一行代码翻译成机器码,然后将这行代码交给CPU去执行,然后进行下一行,翻译第二行代码,再交给CPU执行,所以,Python要比那些编译型语言执行起来要慢)
3、看过那些书(答:python高性能编程)
4、什么是内存泄露?什么时候会内存泄露?
没有删掉。
(动态申请的内存空间没有被正常释放,但也不能继续被使用的情况。没有释放内存)
5、关闭程序的术语?
不知道!
(可能是关闭进程,不确定)
6、指针和引用?什么时候用指针什么时候引用?
(指针可以不初始化,引用必须初始化,且绑定后不能再变;向函数中传递指针和传递指针的引用的区别:
传递指针,会先复制该指针,在函数内部使用的是复制后的指针,这个指针与原来的指针指向相同的地址,如果在函数内部将复制后的指针指向了另外的新的对象,那么不会影响原有的指针;
对于传递指针引用,如果将传递进来的指针指向了新的对象,那么原始的指针也就指向了新的对象,这样就会造成内存泄漏,因为原来指针指向的地方已经不能再引用了,即使没有将传递进来的指针指向新的对象,而是在函数结束的时候释放了指针,那么在函数外部就不能再使用原有的指针了,因为原来的内存已经被释放了)
7、知道那些数据结构?
答:堆 数组 列表 栈
8、什么是堆?
答:平时只用数组模拟堆,不知道真实的结构,认为是父节点-子节点这样状态的数据结构(超高频问题,一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS(操作系统)回收。分配方式类似于链表。向上增长,栈的分割开辟在程序运行时进行,内核顺着链表找到一块足够大的空间交给程序,如果没找到就析构调无用内存再找一次,更具体的请自行总结一下并时常复习,区别包括申请方式、系统响应等很多)
9、堆和栈的区别
栈就是存东西的空间,往最里面存,出来是最外面出来(超高频问题,函数运行时分配,函数结束时释放。由编译器自动分配释放 ,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。向下开辟,速度很快,局部性能好的话会和寄存器交互,存PC指针,函数参数多也会组成栈帧存到栈里面)
10、进程和线程
(超高频问题,我看了深入理解计算机系统后的总结:1、进程就是活着的程序,程序不过是一些文本,运行着的程序就是进程,是系统进行资源调度和分配的基本单位,掌握资源,包括内存等,线程就是轻量级进程,是CPU调度和分派基本单位。2、由于进程占有资源,压栈和出栈慢,所以切换不灵活,线程不占资源,只占必要的资源(递归要压栈所以有一点资源),所以线程容易通信->在进程分来的内存中直接通信,容易并发->切换灵活,同一进程的线程切换速度很快,因此线程开销小3、地址空间,进程独立,同一进程的线程共享资源,对其他进程的线程独立)
事后总结:
显然挂了,特别开心,让我明白一个问题,有的公司深度网络工程师=后端开发。
作业帮二面2019.7.24,意向书
一面90分钟
先做两道题:
1、从数组找三个数,三和与value差最小
要求时间O(n2)空间O(1)
我的写法是排序+双指针,leecode上的原题,没怎么刷过leecode,还好解法一致。
要求排序用快排
2、字符串A 、B,B占A最短的子序列(A中最短的子序列包含B)
面试官和我都笑了,因为python切片+in操作符四行结束,面试官也笑了,于是我们约定in这一步自己写函数。
暴力解决一切花里胡哨
1、介绍Kaggle比赛(从EDA开始到最后)
2、ID3\C4.5等基本树 是二叉树还是多叉树 被切过的特征还会再切吗
离散特征(离散数量>2)是多叉分类,连续是二叉分裂,连续可以在切,离散不可以(当时回答的是可以再切,被提示后说了自己的matlab实现,先做集合,遍历特征,保存最大的信息增益位置,然后对特征切分,切分后把这个特征从集合中删掉,所以离散特征切完就不在切了,还好反应过来了,连续性特征可以再切,详情可以去看看源代码)
3、介绍BN
(超高频题目,可以介绍的很多,机器学习本质是学习分布,特别是logloss损失,等效优化交叉熵,而交叉熵用于衡量分布的一致性。1、预白化,训练块,sigmoid两端饱和梯度小,BN可以缩放到线性区2、分布学习,NN深了之后每一层分布都会偏移,BN压缩分布使得各层分布趋近于一致3、BN可以看做一定程度的数据扩充,数据做了抖动处理。注意BN的训练过程要记得,当前批次归一化,预测的时候是全部数据,而且BN层有两个超参数要优化)
4、GBDT和RF哪个树比较深
RF深。说了boost和bagging的思想。boost使用低方差学习器去拟合偏差,所以XBG和LGB有树深的参数设置,RF是拟合方差,对样本切对特征切,构造多样性样本集合,每棵树甚至不剪枝。
5、XGB特征重要性程度是怎么判断的?
答:不清楚,但是用的很多,猜测是按分裂点的次数(在所有树的出现次数),答出了频率这一点
(gain 增益意味着相应的特征对通过对模型中的每个树采取每个特征的贡献而计算出的模型的相对贡献。与其他特征相比,此度量值的较高值意味着它对于生成预测更为重要。
cover 覆盖度量指的是与此功能相关的观测的相对数量。例如,如果您有100个观察值,4个特征和3棵树,并且假设特征1分别用于决定树1,树2和树3中10个,5个和2个观察值的叶节点;那么该度量将计算此功能的覆盖范围为10 + 5 + 2 = 17个观测值。这将针对所有4项功能进行计算,并将以17个百分比表示所有功能的覆盖指标。
freq 频率(频率)是表示特定特征在模型树中发生的相对次数的百分比。在上面的例子中,如果feature1发生在2个分裂中,1个分裂和3个分裂在每个树1,树2和树3中;那么特征1的权重将是2 + 1 + 3 = 6。特征1的频率被计算为其在所有特征的权重上的百分比权重。)
6、XGB很容易理解它的回归和二分类,如何理解多分类呢?
谈笑中度过,一开始回答的label encode ,用onehot+softmax,但是每棵树如何是拟合softmax前一步呢。这个我确实不知道,面试官提示我说三分类,构造100棵树还是300棵,我就意识到了,回答原以为是100棵。
面试官说构造三百棵树,拟合三分类,再softmax。
(onehot之后,输入标签是一个向量,对向量中每一个预测点集成一群树)
二面55分钟
1、先问你是报的NLP方向不
不是,算法方向,讲实验室项目,用了很多图像的NN算法
2、三道题
第一题:第K大的数
讲了三种方法
方法1:堆排序 分析复杂度是O(Nlogk)(没分析错把)
方法2:快排二分 分析复杂度是O(N)
方法3:排序+查表 分析复杂度(NLogN)
要求O(N)所以用的快排二分,面试官说快排能做这道题?但快排是最快的(我知道的)也正好是要求的O(N)复杂度
(百度了一下,快排和hash最快,其余都不快)
手写python代码,但是编译不知道哪里也错了,这个IDE也不提示,面试官也很尴尬,说以前用牛客的可以报编译错了在哪 于是我就说下面的题用C++写(这个问题很严重,面试的时候找不到bug,所以一定要小心python,一定要bug free,不要老实用C++)
第二题:
地板n*3,木板1*3,几种排法
dp[n]=dp[n-1]+dp[n-3]
第三题:
等概率1-7
造等概率1-10,分析调用1-7的次数期望
7进制,掉用两次产生0-48,然后截掉40和40以上的再//4+1
期望不好算,是个数等比列求和,然后我就口算的近似值2.5n
想一想,可能是面试官压力面我,所以才会质疑快排把,分析了为什么是O(N)而不是面试官说的O(NlogN)
然后向他解释为什么部分排序可以解决这个问题,面试官的水平应该是没问题的(PS:不要以为面试官能力不行,绝大多数面试官水平都到位)
谢谢作业帮
效率很高,发完简历一天就面试了
不说了,毕竟是意向部门,大概率以后搬砖的地方
一面很顺利,二面一百分钟,在和面试官的交流中学到了很多东西
腾讯
没有内推,直接在官网上写的简历,好像也是1天还是2天就面试了,但是。。
意向部门TEG
电话直接开始:
研究岗
自我介绍 ,聊聊项目
对我们部分感兴趣吗:部门做日志检测 安全领域
互相了解
要开会,下次
10点:继续聊上次的内容
全程比较轻松愉快
二面结束,但是状态还是二面待安排。。。
和面试官讨论如何用机器学习的方法去处理危险日志检测。从头复习了各大学习的知识,也算自我反省了。这里能获得的比较突出的经验就是,很多部门还是规则学习为主,对机器学习的分类情况有强烈的可解释性要求。所以树模型和LR等可解释性好的模型很受青睐呀。但最后面试官“感谢”了我,估计是暗示我挂了,桑心
通知笔试五题A了3道半,成绩也还行把,但是部门锁我简历。。。
通知了“两面”,几分钟结束,随便聊聊,说9月份继续面
当前流程已结束,舒服了,按理来说早该结束了呀,这个部门没有机器学习岗,但是想找个算法工程师来开辟一下业务,问我大概要招多少人emm~
拼多多2019.8.13
拼多多 待感谢信
一面:
自我介绍
科研项目介绍
Kaggle 比赛介绍
腾讯比赛介绍
RNN用过吗 用过:项目+Kaggle
LR用过吗 用过:Kaggle的二分类检测
XGB和LGB区别:
只想到三点,特征排序,特征切分和直方图和全排序
说他们共同点较多 小提一点,又小提了GBDT到XGB和LGB,然后扯了扯实际用这两个模型的感受,然后说只记得三点不同了,实际效果xgb不输LGB但是调参不好搞,而且LGB很快
(
1)更快的训练速度和更高的效率:LightGBM使用基于直方图的算法。
2)直方图做差加速:一个子节点的直方图可以通过父节点的直方图减去兄弟节点的直方图得到,从而加速计算。
3)更低的内存占用:使用离散的箱子(bins)保存并替换连续值导致更少的内存占用。
4)更高的准确率(相比于其他任何提升算法):它通过leaf-wise分裂方法(在当前所有叶子节点中选择分裂收益最大的节点进行分裂,如此递归进行,很明显leaf-wise这种做法容易过拟合,因为容易陷入比较高的深度中,因此需要对最大深度做限制,从而避免过拟合。)产生比level-wise分裂方法(对每一层所有节点做无差别分裂,可能有些节点的增益非常小,对结果影响不大,但是xgboost也进行了分裂,带来了务必要的开销)更复杂的树,这就是实现更高准确率的主要因素。然而,它有时候或导致过拟合,但是我们可以通过设置|max-depth|参数来防止过拟合的发生。
5)大数据处理能力:相比于XGBoost,由于它在训练时间上的缩减,它同样能够具有处理大数据的能力。
6)支持并行学习。
7)局部采样:对梯度大的样本(误差大)保留,对梯度小的样本进行采样,从而使得样本数量降低,提高运算速度
)
代码水题,直接让面试官选C++还是Python,面试官(好像所有面试官回应都是一样)“你选就好”
我选就选python了写得快
棋盘有棋子,只能左上走到右下,右走或下走,问最多经过棋子数
dp[i][j]=max(dp[i-1][j],dp[i][j-1])
if chess[i][j]=='棋子':
dp[i][j]+=1
二面:估计凉凉
打断buff 搞我思路
1、gbdt和xgb
(gbdt、xgb、lgb凡是项目提到了一定要熟练掌握)
2、BN、Dropout
( Dropout可以作为训练深度神经网络的一种trick供选择。在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0,当然这个“一半”是超参数,自己设),可以明显地减少过拟合现象。这种方式可以减少特征检测器(隐层节点)间的相互作用,检测器相互作用是指某些检测器依赖其他检测器才能发挥作用。
Dropout说的简单一点就是:我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征。
其实就是个Bagging策略,构造子网组合。)
3、为什么不用先用LR呀(LR这么简单用它干嘛)
用LR做做二分类,做做stack还是挺好的,但LR总感觉表达能力不够,特征比较粗的话效果可能一般。
4、腾讯比赛特征如何离散化啊 连续性特征也能交叉啊为什么不交叉
离散化就是数据分桶,我这里按百分位分桶,结果和面试官解释了很久为什么百分位分桶比较均匀,百分位是数据排序的百分位,而不是区间的百分位。
连续性特征交叉,连续性特征映射成离散特征后,可以和连续性特征一起送到嵌入层里。
5、AUC知道吧,回归怎么计算AUC
不知道怎么计算,一查 根本没有..是不是我听错了 他其实想说逻辑回归的AUC怎么计算
(回归没有AUC这么一说)
6、堆和栈哪个开辟的快
MMP完全说反了,答完很久才反应过来。说的是堆编译的时候分配好了,不用再开辟伸缩什么的快,栈要伸啊缩啊所以慢(见前面的答案)
7、重载和重写
(注意重写是对虚函数的重写,我当时就答错了,所谓重载就是同名函数参数表不同,编译时会对函数改名,其实运行的时候他们已经不是同名的了;重写是虚函数重写,子类对父类的非虚函数在写一遍叫重定义或者隐藏,反正不是重写,重写是对虚函数的重写,我当时答错了)
8、大数据 买东西 找买东西最多的100个 怎么做
建个哈希表+小顶堆
9、MAP底层怎么做的
我说还没看底层代码。(话说我一直不知道有MAP这种东西存在,都是手撸哈希表,准备有时间看一下STL源码分析)
(底层红黑树)
索引复杂度呢 我说,log(n) 恍然大悟索引是二叉树
10、有没有O(1) 的?恍然大悟 我擦原来还有哈希表
哈希表冲突怎么办
回答了拉链 重哈希 当前+1
(同样高频问题,拉链:链表,冲突了就在链表后+1个;探测:线性探测,二次探测,就比如当前的值+1;再哈希:多个哈希函数)
蘑菇街2019.8.14
面试体验特别好,一二面很顺利,然后HR又特别好,感觉HR面已经过了,就差中间的交叉面了
这里说一个点:第一次接到面试通知的时候,打开链接是一个界面,上面有个面试时间、可编辑框、确定按钮和放弃按钮。
提示写的是:如果点确定,时间将不能更改。我又不敢点放弃,打电话问的HR,说写上钟意时间在点放弃就行。
第二次面试的时候,这个框的提示语变成了,如果点确定,时间将不能更改,如果时间不合适,请写上合适时间并点取消。
我就感觉HR贼好,于是二面的时候疯狂表达了我对HR工作的满意、支持和欣赏,二面说我的夸奖她会反馈给HR滴。所以我感觉HR面是不是已经过了,就差交叉面了。
不过我说的都是实话,我确实很喜欢她们的HR。
自我介绍,两道题
第一道:
1000以内的最大素数
说了Python能够O(1)空间实现素数生成器,筛选法,但是没写,没要求就不写,直接bool判断就好,注意从大到小
分析复杂度,如何减少复杂度?从上到下,从999开始往下搜,搜到就停,每次-2。
bool判断,从2到根号x开始,全求模,非0跳出False。
但是好像面试官不会python哦?于是改用C++下一题
第二道:
不用除法实现除法,很简单
注意我的写法里,C++里abs(一个负数)可能溢出,但是无所谓面试的时候速度A比较重要,平时要注意这些细节,而且python不会溢出
笔试的时候刚准备二进制优化就下一个话题了,面试的时候写的,凑合看看吧
using namespace std;
int jianfa(int num1,int num2)
{
int re = 0;
bool fuhao = false;
if ((num1<0 && num2<0) || (num1>0 && num2>0))
{
fuhao = true;
}
num1 = abs(num1);//小心溢出
num2 = abs(num2);//小心溢出
if(num2==0)
{
cout<<"div zero error"<<endl;
return 0x3f3f3f3f;
}
if(num1<num2)
return 0;
int tmp=1;
while(num1>num2)
{
tmp*=2;
num2*=2;
}
num2/=2;
tmp/=2;
while(num2)
{
if(num1>=num2)
{
num1-=num2;
re+=tmp;
}
num2/=2;
tmp/=2;
}
if(fuhao)
return re;
else
return -re;
}
int main() {
int num1,num2;
cin>>num1>>num2;
cout<<jianfa(num1,num2);
return 0;
}
问了很多很多:
个别想不起来了失忆了。。
1、为什么没有实习经验?
第一点老师不让找工作。(这是真话,今天老师对另一个同学说,你找到工作了吗,你找到工作但是毕不了业你说工作是不是白找了,。。。)
第二点,为了能够接触到实际工程,在科研之余,参加了比赛,巴拉巴拉。面试官可以满意。
2、LR用过吗?
必须的
3、LGB比XGB好的点?
直接介绍二者不同
4、L1、L2不同?L1为什么能稀疏?
从数学分布讲了,一个是拉普拉斯分布 一个是高斯分布;讲了图解为什么L1能稀疏,一个圈一个菱形,容易交在轴上。工程上讲了,L1的近似求导,区间内0区间外优化。然后L2是直接求导比较简单。
5、哪些学习器是凸优的呀?
LR sigmoid+logloss 凸优 。线性回归,最小二乘凸优。SVM凸优。NN肯定不凸优,因为往往收敛到鞍点。PCA无数学解,但是利用特征值反而得到 最优解
(注意sigmoid + 平方损失不是凸优化)
6、特征重要性你怎么做,例如特征组合和删除,调参你是怎么调的呀?
答:特征组合用onehot+交叉+EMBEDING。组合的话要看实际分布,讲了自己构造过的一个和标签有线性关系的组合,说自己用的是遍历的方法,用两两数学关系构造新特征,看和标签的线性关系。
特征删除等想到了某个KAGGLE大佬的特征筛选步骤,从他的kernel我也是学到了很多。
调参:
第一步祖传参数。比如树模型的深度、采样频率等,这个主要还是经验
第二部调参,比如尝试新特征,特征采样频率要设为1啊这种细节
7、知道几种激活函数?
我说最简单的SIGMOID TANH RELU我就不提了,讲了讲某个比赛时候用到了leakRELU,然后谷歌的论文里面的swish函数,随口介绍了一下这个论文。
8、鞍点是什么?
我嘴贱说这个干吗,然后我说忘了,但绝对不是局部最优点,看表情面试官可以满意,其实真忘了。
(结合鞍点图像理解更佳。注意一个方向上升,所以很容易坐滑滑梯从上方滑到鞍点。另一个方向是下降,所以可以坐着下降的滑滑梯下去,但是鞍点这里梯度是0,是平的,所以优化就容易困在这里。前面多走几步就是滑滑梯但是他无路可走。
百度百科的的解释:
鞍点(Saddle point)在微分方程中,沿着某一方向是稳定的,另一条方向是不稳定的奇点,叫做鞍点。在泛函中,既不是极大值点也不是极小值点的
临界点,叫做鞍点。在矩阵中,一个数在所在行中是最大值,在所在列中是最小值,则被称为鞍点。在物理上要广泛一些,指在一个方向是极大值,另一个方向是极小值的点。
广义而说,一个光滑函数(曲线,曲面,或超曲面)的鞍点邻域的曲线,曲面,或超曲面,都位于这点的切线的不同边。)
先问用没用过RNN
答:项目的RNN效果,分析RNN在项目里不好,和比赛中RNN前期效果(前期效果最好)
用过GRU吗,为什么LSTM能够记忆长时记忆。
答:GRU用过一次,在哪里用的。用的记忆门,保证长时记忆传输。
9、Attention有哪些?
答:之前说到了自己用过attention,只用过,不知道原理。
(作为一个调参侠,各种网络随便试,但是attention的本质我还是不甚理解,attention is all you need?)
10、Dropout为什么预防过拟合?
从bagging的角度答的,NN是偏差小方差大的学习器,适合用bagging,构造子网络在预测的时候组合,相当于构造了学习的多样性,实现了bagging。
11、协同过滤:
说了解 但是没写过代码
(协同过滤,感觉一个学生要是搞科研为主还是很难接触到,感兴趣的可以了解下,特别是面电商的商品推荐工程师呀还是容易问到的)
12、CTR估计,都用什么?
我说LR和FM ,代码写过,FM主要是NFM,其他的FM都知道理论但是没写过代码
13、蘑菇街是干嘛的你造不?
答:卖衣服滴。于是他介绍蘑菇街主要是电商和直播。(听到直播我差点笑了,快憋不住了,就莫名很开心,然后他看我绷不住了赶紧说直播是目前蘑菇街发展最快的模块)
二面:
顺利,没有撸代码,因为时间不够面了半小时,二面说一面的评语是代码能力特别好,所以不写代码了
我的项目里有一个完整的软件实现,我负责的主要部分超过了1万行代码,可能是这一点让面试官觉得我不用谢代码了吧。
其实大部分正常手撸代码都可以(除了字符串是我的弱点),真出到不会的题是真的没办法
介绍了项目讲了项目细节
项目里编码领域内特征组合都是异或,所以用RELU+BN提特征,BN真的是巨大提升
讲BN原理,公式,实现
(可以去看看BN源代码,不长)
为什么用BN压缩异或后映射的正数部分而不是什么什么(没听清)?
我提到了BN层也算做了数据扩充,而且BN层把只有0,1的编码流做了抖动转化,让梯度能变起来,优化的更好(机器学习可行无非就两点,第二点就是优化问题)
为什么用CNN?然后面试官介绍推荐领域内的另一种东西(Embedding),这个Embedding映射了隐向量,你觉得是CNN交叉好呢 还是隐向量好呢
回答:(其实我知道Embedding,因为一起参加比赛的朋友手撸了NFM,第一层就是这个嵌入层)我的回答偏向于场景,编码领域内的一个特点:只有局部相关,时不变。所以用CNN,做全局相关的Embedding反而不好。推荐里面特征离散化后稀疏,而且特征间本身可能具有高阶交互信息,所以映射成隐向量效果会较好,如果是推荐,我建议用隐向量而不是CNN,其实这是由场景决定的,是数据的特点决定选用什么学习器,使用什么网络。(我还介绍了图像为什么ResNet更好,但是编码里我的两层极限调参网络性能超过了残差网络,其实都是场景决定的)
一面
1、自我介绍
没什么拿得出手的东西呀,我主要是算法工程师,而且实际科研项目要么专业性强(编程算法都不沾),要么是算法的东西
说了自己写的科研软件,代码量1W以上写了一堆报告 其他的简单一提
自我介绍的时候提到了自己喜欢玩游戏(以前玩盗版,现在玩正版,steam50级以上,然后游戏快100了)
(后端开发都是自学了一点,而且互娛不要python)
2、平时喜欢玩什么游戏啊?
最近一段时间科研,没玩游戏。以前喜欢玩塞尔达、黑魂、怪物猎人等
3、网易的游戏玩过吗?
阴阳师和炉石
4、聊聊炉石?
以前特别喜欢玩炉石,主要是喜欢开包(面试官笑),为炉石花了很多钱,因为我喜欢一个游戏就很愿意支持他。炉石的优点在于它有竞技性,而且也是打牌类的游戏,所以本身有趣味性,而且每局有随机性,这样每一句的体验不一样。另外一点就是攒金币开包,金币多了开包后卡池更新,可以有新的构筑,新的体验。这样每过一段时间都会新体验,留住用户,我本身也是喜欢紧张刺激的开包环节
5、三道题,比较简单,要写测试用例
手撕成功,写代码还是比较快的
第一题二分
python写的编译报错,牛客网查不到错在哪,我就赶紧c++重写了一个
讨论了二分的四个边界条件
return st,en二种对应返回搜索边界,data[mid]<value和<=value,两种对应二分上下界
共四种,然后说四种情况对应,每种的取值范围
返回st,返回的取值范围是0到数组长度,返回en,则是-1到数组长度-1
st和en含义不一样,这个最好自己写写理解一下
(lower_bound是value大于等于数组第一个,即找到数组第一个小于等于value的位置,如果返回时0,那么二分的结果不一定是对的,因为返回的值阈值是0到N-1,如果数组中所有元素都大于value,这是应返回-1,但是返回的结果是0,所以返回st会有取值下边界,同理en是取值上边界的问题)
然后说了C++算法标准库(lower_bound和upper_bound)用的哪两种形式:返回st的那两种
第二题是二叉树的深度
python手撕,又报错,然后无IDE查bug还好查到了,print大发好,对python,如果print(“XXX”)没输出东西就说明没运行这一行。
定义树class的时候写的是.next,晕了,应该是.left和.right
第三题是数组旋转
左旋转,自信一波分析写完是右旋转,一脸懵逼,怎么看都是左旋转跑完就是右旋转
然后再那试了试改i,j,然后第二次就输出对了,晕,运气比较好
由于循环用的常数限制,要求改成了数组的范围,注意python len(data)是行 len(data[0])是列
正常构造一个和data一样大new数组是先列后行 [[0 for _ in range(len(data[0])] for _ in range(len(data)]
然后循环是先行后列(这样局部性更好,运行速度快,更容易缓存命中,当然面试官也没问我也没提)
写法应该是对的,但我不敢改成行列不相等的情况,万一错了呢.PS:想了想应该不对,因为new数组我照着data开辟的,应该行列反过来开辟才对,先行后列构造的话正好对应旋转后的情况,幸好没深究,不过这种bug很容易改,print()大法print一下就出来了
问问题:好希望他问我机器学习的东东,这样我就能装逼了,然而
6、静态内存和动态内存?
讲了static和堆栈是静态,编译的时候决定了大小,动态内存可以自由开辟->堆,也不知道对不对。。
(回来问了问另一个收割大佬,应该是这样)
7、堆是?
说了向上开辟,速度慢、运行时改,然后开辟的过程,链表存着下一个位置和这一块有没有使用,如果没找到就析构合并内存再找,再找不到返回null(可以参考前面的答案)
8、堆栈是?
说了向下开辟、速度快、编译时分配、主要是存PC指针,然后函数入口参数多组成栈帧存进去等着恢复
9、malloc和new区别 free和delete?
1、一个是函数(面试官没问,但我自觉呀,诚实回答忘了是哪个头文件里的了,事后查了查是stdlib我擦我天天写没想到是这个)一个是关键字
2、malloc要算大小,返回void*(然后随口提到void*可以转XX *),强转后按转完后的类型用,要自己算大小;new的时候传类型,就比如100个int,然后直接开100个就好了,他自动将int长度算进去
3、malloc再堆上,new在自由存储区(然后回答忘了自由存储区再哪了) 讲着讲着忘了free和delete的事了
(自由存储区和堆似乎是概念上的区别?我丢,深入理解计算机基础是按C讲的,我哪知道C++的自由存储区和C的堆有啥区别呀,按理来说假如new是依赖malloc实现的,那么他们不该开辟于同一块区域么。C++默认在堆上开辟new需要的空间,所以new来自自由存储区和堆都行。
网搜的答案:
自由存储区是C++中通过new与delete动态分配和释放对象的抽象概念,而堆(heap)是C语言和操作系统的术语,是操作系统维护的一块动态分配内存。
new所申请的内存区域在C++中称为自由存储区。藉由堆实现的自由存储,可以说new所申请的内存区域在堆上。
堆与自由存储区还是有区别的,它们并非等价。
)
10、智能指针了解不?
我从python的内存管理角度讲了计数法析构内存,和智能指针原理一致。但我自觉诚实的说出我没用过智能指针
11、python怎么解决循环引用的?
是不是想问我智能指针的循环引用解法?我忘了呀,我就直说python本身解不了循环引用的问题(这实话实说,确实解不了,python又不是神,循环引用要靠自己析构,对python来说,循环引用的东西就算程序关了都还在),但python有个库函数可以发现循环引用位置,然后调用垃圾收集器析构掉就好(其实就是定位内存泄露,然后gc把它干掉)
12、计网了解不?计算机网络TCP和UDP的区别?
答自学。回答了很多,挺详细了
(UDP主要用于那些对高速传输和实时性有较高要求的通信或广播通信,
TCP用于在传输层有必要实现可靠性传输的情况
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的;UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
这里建议不是特别熟的回答首部设置不一样,别说的太详细。
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
)
13、长传输和短传输?
不知道
(是http的长连接和短连接吗?HTTP1.1规定了默认保持长连接(HTTP),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接。)
14、操作系统呢?
回答自己看的深入理解计算机系统,看的很详细,收获了特别多
15、进程和线程?
程序不过一段文本,运行起来才是进程,一顿讲,资源/调度单位啊、共享内存啊、并发啊XXXXXX
(见之前的答案)
16、你还有什么问我?
问了两个问题
一问:您能不能了解到其他面试人的信息,然后对着我教研室座位后面的字节大佬猛夸(因为他特别想去互娛做游戏),一开始面试官还以为这个人挂了呢我想捞一手,一听和我同时面了互娱就轻松了说既然这么强一定能过面试,然后我就突然想到好像可以暗示一波,就说我和他报的都是广州,我很想和他当同事(强烈暗示)
二问:我说我是算法工程师,机器学习特别厉害,平时工作内容是啥啊,机器学习这部分我都用上么
求互娱给个开奖机会,教练我想做游戏~(如果百度把我忘了的话),你敢让我过我就敢去
面试经验肯定是面的越多越丰富的,从最初乐鑫的笔试挂,到字节跳动笔试不会写输入流(第一道题我本地1分钟就A了,然后不会写输入流,试了15分钟,然后写了第4题,结果本地能过线上报编译错误,我就很生气了,何况这个输入流更复杂我就直接放弃了),到现在面试一点也不紧张,可以和面试官愉快吹牛逼了,所以说多点经历也是挺好的
---End---
如果你想要了解更多算法岗实习和校招内推,以及算法面试经验和面试题,欢迎加入AI算法岗求职群,详情请见:重磅!2019 AI算法岗求职群来了
本星球不仅面向今年(2020届)找工作和找实习的学生(研一/研二/大三等),还面向刚入学或已工作的人群。目前已有超过1480+位同学加入。星球旨在分享AI算法岗的秋招准备攻略(含刷题)、面试经验和校招/社招/实习的内推机会(含提前批)、学习路线、知识题库和Offer如何选择等。
希望这个星球可以让你少走一些弯路
扫码进星球
如果喜欢招聘/面经/内推,麻烦给个在看
麻烦给我一个在看!