renshuo's blog

实习面试记录

2018-03-22
renshuo

前两天面试了一家公司,面试问的问题基本如下,我尽量回忆,写的很粗糙,凑合着看看,希望可以对大家有那么一点点的帮助

一面

下午两点开始电话面试,是用的微信视频面试的。首先先做了自我介绍,然后正式开始。

算法题

面试官给了我一个网址,打开之后白板编程,双方是可以实时看见的。

第一题

找两个字符串 s1, s2 的的最长公共子串,并输出长度,刚开始说是输出子串,后来说输出长度吧,简单一些。

基本思路是使用一个二维数组 b[i][j] 保存当前字符 s1[i]s2[j] 对比之后,以 i,j 这个位置上的字符为结尾的公共子串的长度。

if(s1.charAt(i) == s2.charAt(j)){
    b[i][j] = b[i - 1][j - 1] + 1;
}

也就是使用动态规划的思想,将数组 int[][] b = new int[s1.length()][s2.length()] 填满,再使用一个变量,保存最大的公共子串长度,最后输出就可以了。

需要注意的是,数组的第一行和第一列是没有 i-1 或者 j-1 的,所以 i==0||j==0 时需要判断临界条件,填入数组只能是0或者1。

第二题

给你一个 rand3() 函数,可以等概率的生成 1,2,3。使用这个函数,写一个 rand7() ,要求可以等概率的生成 1到7 。刚开始没有思路,后来面试官提醒我使用树结构。于是我边说我的思路边思考。

我说使用一个两层的三叉树,这时候面试官打断我了,他说,好,现在两层的结构,然后就有九个叶子节点了,然后呢。然后我脑子就卡卡卡卡卡卡主了。。。。

他说,你都能等概率的生成1到9了,1到7不就出来了吗?!(我感觉面试官都在替我着急)

然后代码没写出来,很尴尬。我先说一下思路,要是不对请大家见谅。

假设使用rand3等概率的生成1,2,3,然后组成树结构如下:

and

那么其实类似于哈夫曼编码的过程,先用一个rand3定位第二位的数字,再用一个rand3定位叶子节点,然后转换成我们想要得到的数字,如果输出的是8或者9,那就再生成一次。

第三题

给一个数组,把奇数排在前面,偶数放在后面。

我使用的是交换排序的思想,分别从前后向中间开始查找,找到前面出现的偶数,后面出现的奇数,交换,一直到中间相遇。

总结

白板编程,没有代码提示,没有自动缩进,所有都要自己敲,很容易出错。我在第二题没有做出来的时候其实已经很慌张了,第三题犯了很多小错误,比如没有写分号这种。

  • 有机会还是锻炼一下自己白板编程的能力,记住一些常用的方法
  • 个人认为代码格式很重要,能提现一个人的编程素养,具体可以看《阿里巴巴Java开发手册》
  • 在做题的时候,要先和面试官沟通一下思路,哪怕自己是错的,也要把思考的过程说出来
  • 面试官很喜欢说 “写一下” ,就是有了思路,也是要写的,写的过程要注意一些小的细节有没有考虑,比如边界条件

问答题环节

基本就是这些,我认为在问答题环节,其实就是要背,当然能理解更好。

一定要把自己知道的都说出来,能扯多少说多少,这是问答,不是简答

二面

一面结束之后马上就是二面,也是慌的不行,为什么别人的套路和我的总是不一样

自我介绍之后进入正题

数据库

对数据库的了解

我说我用过 SqlServer 和 MySQL,最近对Redis数据库也有一些了解,然后开始让我讲Redis,我只是很简单的说了一下,把我知道的都说了。

问我,如果让我改进Redis,有什么想法

真的不会,开始扯(勿喷)。我说,设计一个类似于 MySQL 的 workbench 和 git 的 GitKraken 那样的图形界面,真的,这真的是我的第一想法。

然后他说已经有人做过了,你想怎么做呢,或者说实现什么功能呢,我继续扯了扯,就下一个问题了。

对数据库索引的了解

开始说索引是一个什么东西,优点是什么,然后我说到了B数和B+树,他开始提问了

为什么数据库用B+而不用B,或者你知道哪些数据库的索引用了B或者B+树了

后半问我没有回答,基本围绕前面来说,我说了这两个树的区别,面试官并不满意,于是我继续扯,各种扯,这个题讨论了很长时间

说一下B+树的定义

可能他感觉我扯的太不靠谱的。。。。

最后问了一个开放题,你感觉,数据库的索引差不多有几层

其实面试官也说这个没有标准答案,只是想听一下我的直觉。我回答之后面试官都笑了。。。

操作系统

问我对哪个操作系统比较熟,我懵了

我说我对操作系统的一些概念比较熟,但是仅限于在学校学到的课本知识,对比较明确的操作系统,并不了解

面试官想问我 linux 内核,吓得我赶紧拦住他了

项目

就让我说了一下项目,然后负责的功能。还有遇到的问题。没多问。

网络

首先问了我几个状态码,403,502,504

我就知道403,后面两个没回答上来,但是我说了5XX是服务器错误。

问我,假如我服务器对每个 ip 最多能承受每分钟 10000 的网络访问量,那我如何判断ip的恶意攻击,让我设计一个筛选器,可以拒绝恶意ip的访问。

开始扯

我说用一个计数器,记录每一分钟每个 ip 的访问量,然后一分钟结束的时候清零,可以用Redis来存储。

他开始反驳我,还说用数据库肯定太慢了,不管什么数据库。而且用一分钟清零,不合理。

我说用HashSet,每一秒钟减去一个数值,他说每次遍历太慢了,我说用TreeSet,已经排序了,取前面就行,他说排序太慢了。

到最后我也没有给出一个合理的理由,差不多下午4点半的时候二面就结束了。面试官说,他去和HR交流一下,会尽快通知我,要是一个星期都没有消息,你懂的。

总结

其实二面基本上都是开放性的试题,可能目前有明确的技术可以解决这些问题,但是在我不知道的情况下,我感觉面试官是想考察一下我思考问题,解决问题的能力。老规矩,把知道的都说出来,要敢说,只要不是错的特别离谱,就没事。

对于一些常用的,比如数据库索引、http状态码,学习的还是不够。

三面

三面是一个部门交叉面试,是一个机器学习方面的专家。

首先自我介绍,我讲了我是怎么接触到机器学习的,怎么接触到深度学习的,又是怎么接触到我目前的研究方向的。

这里必须要感谢“机器学习爱好者II”群的群主黄海广博士和群里的所有成员

然后我们对我目前的研究工作讨论了一下,还是很轻松的。

然后他问我对过拟合的理解,和怎么防止过拟合,问了一些SGD和基于动量的梯度下降还有Adam的东西,后面对dropout的理解又问了一下。

总结

三面在我看来是最轻松的,因为问的知识都不是很深,而且面试官也指出我在实际应用上,还是有一些欠缺。


Content