面试形式:电面
一面
面试时间:36min
- 自我介绍(项目啥的说一下不用展开)
- 简历上写了发了paper,谈一谈那一篇sci,具体做了什么,你的创新点在哪里?
- 详细介绍下其中一个项目(然后27min大部分时间都耗在这个上面了,主要是自己把自己给绕进去了)
- MySQL行级锁和表级锁?
- 集合有哪些?哪些是线程安全的?
- 线程安全是指什么?线程安全和可重入有什么关系?
- 谈谈最近读了那三本技术性的书籍?
- 除了工厂模式、单例模式之外,你还知道哪些设计模式?至少举例三种?(我说了代理模式)代理模式在哪些地方有用到?
- 你用三个词语来形容一下自己?
- 你有什么想要问我的?
可以看得出,比较佛系,以为自己挂了,没想到接到电话约二面
二面
代码面
- 说一说自己最熟悉的数据结构?(我回答是hashmap)
- hashmap算法的时间复杂度是多少?(O(1),然后展开说了一下)
- 闲聊数据结构,比如六种排序算法及其时间复杂度,MySQL索引的底层实现原理,B+树的平衡性以及AVL,还有左旋右旋之类(简单聊聊,因为是代码面,也就没有深入)
- 算法题:一个整型数组(nums(0)-nums(N-1)),是否能将数组分成m组,每一组的所有元素之和不超过指定整数r,注意给定数组元素相对位置不能改变
1) 首先谈了下自己的思路,确定面试官出题意图是判断到底能不能分(返回boolean结果)
2) 遍历原数组并进行分组,分组时保证每一组元素之和小于等于r(最接近r),然后用一个变量count累计下所有组数,当遍历完原数组之后,count不超过m,那么表示可以进行分组(true),否则一旦count大于m,不能进行分组(false)
3) 面试官确认思路可行之后,接下来就是代码实现,我用了最笨的方法,另写了一个求和方法,用双指针进行遍历原数组,每移动一次右指针就对两指针之间元素进行一次求和,显然这种求和有很多重复性操作,时间复杂度也是O(N^2),面试官自然问你如何进行优化,最终时间复杂度是O(N)
4) 再面试官反复提示之下,最终发现每次移动右指针的时候,其实左指针根本就没有移动,那么就没必要每次再对两个指针之间的元素进行一次整体求和了,只需要累加新遍历的元素即可(关键是开始一直没想明白为啥时间复杂度是O(N^2)),改完之后,面试官说代码是写了,但是阅读者看着并不直观,不好马上明白你的意图,言下之意还能进一步优化,然后帮我把左指针去掉了。。。竟然左指针也是多余的,因为有了sum记录就足够了,每当和接近r后就会清0,不需要左指针定位了,我们只关注sum和count。。。我顿时觉得,自己还有好长的路要走...
- 好的,今天代码面试就到这里了,你有什么需要问我的?
等HR后续和你联系...
PS:面试官真的很好,没有压迫感,循循善诱,甚至我有那么一刻觉得,他像是我人生中的导师一般,如果能跟着他学习技术,想必是幸福的...
三面
leader面,接到hr电话,二面过了,但是竟然还有一面,问了一下是部门leader,因为曾今有个leader面给我心里留下了点阴影,所以这个我也没有抱很大希望
- 简单问了下你会哪些技术——问到的基本不会,因此也没记下来问了啥,彷佛失了忆。。。
- 简单介绍下你的项目
- 有了解过GO语言么?现在很多公司慢慢转向GO语言开发,说说为什么会这样?
- 目前面试过哪些公司?
- 由于我谈到现在好多公司没怎么放职位出来了,然后他让我分析一下是为什么?
- 你有什么想要问我的么?
等HR后续和你联系...
迄今为止,还没有联系我,童话里都是骗人的:)