注意事项
- 电子简历尽量用 pdf 格式,方便跨平台打开。doc 等格式在不同的电脑上打开会有排版问题,很多后端技术面试官可能使用的是 mac 或者 linux。
- 提前复习回顾重点知识,防止卡在基础上。比如 mac 下著名的 brew 工具作者面试 google 就因为没写出来反转二叉树被拒,后来去了苹果😂.(这就只能看人品和运气和眼缘了,如果没见到二面面试官或者 hr,大概率是挂了)。(树、链表、哈希表、二分、快排、TCP/UDP、HTTP、数据库ACID、索引优化等常考点)。
- 白板编程,练习在纸上手写代码。虽然很多求职者都很抵触手写代码,但是白板编程确实是一种比较好的区分方式。你的思考过程、编码习惯、编码规范等都能看出来。
- 如果被问到工程里不会使用但是比较刁钻的算法题,建议你和面试官沟通的时候问问这个算法或者题目在开发中有哪些实际使用场景,看看对方怎么说😎。少数公司喜欢考一些算法竞赛题,这种对于没有ACM,信息学竞赛背景的开发者来说比较吃力。大部分业务开发岗位应该只会考察基础算法题
- 面试的时候准备充分,简历要与招聘方需求对等,甚至可以针对不同公司准备不同的简历内容。笔者每次面试都会带上白纸、笔、简历、电脑等,即使面试没过,至少也让面试官感觉我是有诚意的,给对方留下好印象。
- 加分项:github、个人技术博客、开源项目、技术论坛帐号等,让面试官有更多渠道了解你,有时候仅仅根据几十分钟的面试来评判面试者是有失偏颇的。(比如面试者临场发挥不好;面试官个人偏好;会的都不问,问的都不会等)
白板编程
其实我个人是反对出纯算法题目的,尤其是有些比较刁钻的直接出算法竞赛题,这对与很多做工程的同学来说是比较吃亏的。没事的时候可以去 LeetCode 之类的网站刷刷基础题。 一般来说 web 业务开发者掌握常见的编程语言内置算法和数据结构就够用了。
- 练习手写常见的算法,比如快排,二分,归并等,记住常见排序算法时间复杂度
- 逻辑正确是前提
- 有图示描述思路最好,如果时间紧代码没写出来,可以直接描述自己的思路。
- 字不要写太大,尽量工整。每行代码之间留有一定的空隙,方便你修改(甚至笔者之前会带上铅笔和橡皮手写代码)
- 如果实在写不出来可以和面试官交流,很多时候如果给不出最优方案尽量想一个次优方案,别上来就说不会
- 想不起来的函数名写伪代码,一般面试官不会强制说让你记住每个 api 的名字
- 如果有多余的时间(一般不会有)注意一些边界条件,防御性编程、代码风格、单元测试等东西,想好一些异常情况(空值、边界值等)的测试用例
手写代码注意事项
这里我就直接引用《剑指offer》里内容,大家写代码的时候可以多加注意,对于应对算法面试,如果准备时间比较多,推荐看下这本书,并且刷一下 leetcode 上的基础题目练练手感。
- 规范性:书写清晰、布局清晰、命令合理
- 完整性:完成基本功能,考虑边界条件,做好错误处理
- 鲁棒性:防御式编程,处理无效输入
结语
这套教程列举的算法很有限,包括图算法、贪心,动态规划,分布式,机器学习算法等很多没有涉及到,因为它们确实需要读者更深入的理论基础,而且这套教程的目的也不是针对算法竞赛。 不过了解了本教程涉及到的大部分算法是可以应付绝大多数的业务开发的。如果读者对算法有兴趣,本教程引用的几本参考书都可以去深入学习。希望本教程能对你学习算法、养成良好的思维方式和编码习惯等有所帮助。
延伸阅读
目前市面上有一些专门针对算法面试的书供大家参考,如果你正在准备算法面试,我强烈建议你看看下面的参考资料学习解题技巧:
刷题网站
leetcode 和牛客网是国内常用的两个刷题网站,笔者建议刷一下高频的 200 道题左右,基本可以应付大部分公司的算法面试了。
- https://leetcode-cn.com/
- https://www.nowcoder.com/exam/oj