前言
这段时间稍微断更了一段时间,因为我在准备面试。经过两次面试后,有一些比较深刻的认识。对于大厂来说,除了对专业知识考究之外,对算法也尤为看重。
简单的说一下情况,字节已经拿到offer,腾讯所有的面面试已经通过了,也应该有offer了。字节一共4面:3面技术,1面hr;腾讯5次技术面,1次hr面。其中5面是2个面试官上阵。
总的来说腾讯的面试确实强度更高更加持久。字节是分开一次1个小时面试的。而腾讯1、2面是一次一小时,而3面和4面是连续面试一口气高强度的面试2小时,5面则是2个面试官轮流提问。腾讯是持久战稍微脑子不清醒一点就可能出现大错漏。我在4面就是如此,差点出事了。请准备好糖分和水分及时补充,或者洗把脸保持清晰。
正文
面试的过程一般只有1个小时,如何在一个小时内彻底的考究你本人的水平究竟到达那种境界,也是面试官努力的方向。
而面试往往是由两部分构成:
- 1.算法
- 2.专业知识
关于算法
为什么把算法摆在第一点,因为算法在我看来这是大部分没有面试过大厂的朋友可能会忽视的一方面。它的重要程度不比专业知识的考究来的低。
在1-2小时内,如何能快速的看到你编码水平和思维就看这些算法的考究。
因此需要对常见的数据结构比较熟悉,如链表,树,栈,堆。需要知道遇到数组相关的题型可能需要用到如快慢指针等解题思路。还有广度深度优先算法。最后,如果还有更难一点的,会涉及到回溯,动态规划等解题思路。
前面几点都比较好处理,只要在leetcode上做到一定量的题目,都能反应过来。我本人认为我并非是聪明的人,做了300快400道题也仅仅只是摸索出了一些大致的套路。我是完全比不了那些做了100+道题就能灵活掌握算法的大神。 但是经过了系统性的训练,遇到一些常见的算法解题思路可以快速的反应过来。
而动态规划相关的问题,我看来是最难的。关键是需要判断题目是否可以分解成小问题且小问题之间不能互相影响,接着找到动态规划方程,或者是状态转移表。
在听到面试官的算法题后,先不要急着下笔。最好在下笔之前和面试官聊聊你的思路。不同面试官的要求不同,有的面试官,希望算法是原地算法,有的面试官希望时间复杂度降低,有的希望空间复杂度降低。
最好能清晰的表达你的初步思路后,面试官会知道你的算法的方向是否正确,可以一定程度上给予你方向上的指引。
记住就算你做过原题,除非你的方案能保证是从空间和时间复杂度是最优,不然我还是建议面试者多和面试官交流。在交流的过程中,面试官也能明白你的思考过程,从而判断你这个人的编程能力如何。
千万不要小看这个模块的考究,如果说面试专业知识是100分,那么算法题可以占据50分。如果你写不出,或者思路完全偏离了,那就可以说再见了。
在我写文章学习的这5年里面,也有不少的朋友问我的意向,其中不乏有大厂。然而我深知我的算法水平确实不太行,学习的源码水平还不足,很多时候都婉拒了。也就今年和去年,练习算法已有近2个年头,才敢出山试试。
就算是这样的我,算法上的能力评价还是不高,只能说是达到了大厂的合格线,还需要继续加强。
最后,再给两点建议:
-
一个人光看不练是不行的,一个人瞎琢磨效率偏低。
-
最好可以买几本书或者课程指导。我是看了辉哥的课程,阅读了极客时间的刘超的数据结构,还阅读了书籍算法4。把基础都补充好后,可以去leetcode中对每一个数据结构专项进行训练。在这些基础上,在做一做剑指offer中经典题目也就差不多了。
关于专业知识
网上很多人都在求大厂面试的真题,实际上我看来意义并不大。因为面试官并不会面试你写在简历之外的随意一个问题。一般都是问你简历上的工作成果,以及背后延伸出来的知识点。更多的还是需要自己日常的积累。
当然也有一些老生常谈的基本考点,如Handler,多线程等。
因此,背面试题不是最重要。关键是回顾你的简历上的工作成果以及简历上的知识点,并不断的深挖。
下面是面试情况,以及一些简答。实际上在回答的过程中,可以回答的更加详细,本文只是筛选了部分问题简单介绍了知识点的要点。
字节面试
字节面试一共4面。字节的面试风格偏向基础的内容,以及简历上知识点的扩展。
字节1面
-
1.自我介绍,项目经历,项目上的优化项以及原因
-
2.为什么使用
mmap
优化io读写,mmap
和传统读写有什么区别?为什么选择它?
简答大意:mmap
本质上从内核中 进程中申请了vm_area_struct
虚拟内存后,把虚拟内存保存到 file结构体address_space
结构体中的i_mmap
中。当需要访问这段虚拟地址,就会产生却也中断,通过伙伴系统申请出物理内存绑定。如果是文件映射还会预读取文件内容,之后读取可以命中后续的缓存。项目中也有频繁进行写入,可以快速的同步到内存中。
- 3.Object 中有什么方法?
简答:equal,wait等。
- 4.Object 的equal实现?重写equal需要注意的方面。
简答: equal 本质上是获取Object的 hashCode。而在hotspot虚拟机中,计算方式在类markOop
中,hashCode的计算是获取对象的高16位向右移动16位并且与上掩码。
equal 重写时候,需要按需求处理。一般的,为了让HashMap等需要hashCode计算正确,需要把equal中每一个成员变量。
- 5.
synchronized
原理。
简答:翻译成字节码后,本质上在虚拟机中对应两个字节码 MONITOR_ENTER
以及 MONITOR_EXIT
。通过Monitor进行临界区保护。