面试了一个月,到底要不要刷算法?我有了答案

>点击上方“Java Dev关注<

看看你有多少好友也关注了我

面试了一个月,到底要不要刷算法?我有了答案_第1张图片

Photo From Instagram

最近这段时间输出较少,主要都去忙着面试了。忙活了大概一个月的时间,也面了不少公司,基本尘埃落定。当然啦,在有些公司的面试过程中也是碰了一鼻子灰,也得出一个结论:算法还是要从平时抓起。

面试中的算法

面试了这么些个公司,根据对算法的考察调性我将它们分为了三种类别。

第一类公司是先聊项目,技术点。面试结束的时候出 1 - 2 道算法题。

第二类公司是个奇葩,上来二话不说开始做算法题,算法题做不完不聊别的,这意味着算法题挂了就拜拜。

第三类公司呢,基本不做算法题,干聊项目,系统设计,注重实战经验。

你可能会说,既然这样我如果不会算法,那我就试试第三类公司就好了。然而我要告诉你的是,我前后总共试了十多家公司,只有一家公司整个面试流程中没有做算法题,它家虽然没有聊算法,但是对平时使用到的技术点和系统设计能力进行了地毯式的考察。

所以综合来看,为了在面试中拿到不错的成绩,还是要掌握算法这个基本功。

我举个例子,假设你的项目没有什么亮点和难点,面试官挖掘一番后发现项目确实简单,等到结尾的时候面试官如果出了几道算法题,你能流畅的做出来,并且可以不断的优化改进得到最优解。那么即使你前面项目经历不是很棒,面试官即使不给你面试通过,也会在面试评价的上面留下类似这样的备注:候选人项目经历一般与本岗位不匹配,但是技术基本功扎实,推荐应聘其他部门岗位。

你看,虽然你的项目经历不是很优秀,但是由于你扎实的基本功也可能会得到面试官的青睐。对于一些要求丰富项目经历的岗位不合适,但是试试其他部门的岗位没准就面中了。现在的大厂都有自己的人才库,基本每轮面试都会给候选人的面试表现留下评价,所以基本功一定要扎实,不然如果被备注:技术深度不够,基本功不扎实。那么基本上其他用人部门也不会捞你的简历了,即使你认识熟人,简历捞起来了,面试官也会看面评,很有可能就先入为主了。

如果你想去的公司恰好属于我上面提到的第二类公司,算法考察调性非常变态,这时候算法基本功就是敲门砖了,如果你没有掌握,那么基本就无缘你的目标公司了。

有人要说了,我可以去第三类公司呀。不好意思,这类公司虽然不明着出算法题,但是它们的技术深度考察里面会问到一些底层实现原理,这时候还是逃不脱算法。

例如面试官问你,MySQL 的索引是怎样的一个数据结构?B+ 树;为什么 采用 B+ 树呢,它有什么优点?emmmm,如果你不知道 B+ 树的数据结构和算法复杂度分析,到这里相信你已经面红耳赤了。

再比如说 Redis 的缓存中使用到的 Sorted Set 底层采用的跳跃表数据结构,为什么不采用二叉树来实现呢?等等一些问题虽然不做算法题,但是也都是对算法的考察,也是对你的技术好奇心的考察。


工作中的算法

掌握算法只为了攻克面试吗?当然不是。

上述提到的第三类公司里面,关于技术深度会问非常多的原理性方面的问题,例如上面说到的 MySQL 为什么采用 B+ 树?Reids 中的 Sorted Set 为什么要采用跳跃表作为存储结构。

你可能会想,我不知道它们的底层实现原理,我一样可以写代码写到飞起,功能很快的做出来。但是假如你们系统的业务量迅速增长,那么你系统里面的每一行代码都有可能成为系统的性能瓶颈,而你又对代码中使用的数据结构和算法不理解,此时你可能会束手无策,慌乱的 Google 查原因,但是如果你能事先掌握这些知识,出现性能问题时候你就可以游刃有余的干掉他,避免成为一个 Google Oriented Programmer。

举个例子,假设现在需要你实现这样一个功能,统计接口响应时间的 95 线和 99 线(调用链监控系统 CAT 中的一个小功能),如果有 100 个请求即为请求时间从小到大排序,第 95 个 和 99 个请求的响应时间。如果你的基本功不扎实,很可能你会采用一个 ArrayList 来存储这个 100 个请求的时间,然后每次去将它们排序然后获取到第 95 和 99 的响应时间,但是假如你知道 Java 还为我们提供了 TreeSet 或者 PriorityQueue,你会发现这是一个更明智的选择,计算的时候不用每次去重复的去排序所有请求的响应时间大小。

就这样积小成多,你会慢慢的从一个 CRUD Boy 转变为一个会思考、有技术深度的 Tech Boy。

说到这里憨厚老实的 Tech Boy 应该已经蠢蠢欲动安耐不住学习的欲望了,但是部分闷骚 Boy 可能会想,害,算了吧,我就是混口饭吃的,还是做个安安静静的 CRUD Boy 吧。


生活中的算法

好吧,闷骚的 CRUD Boy,我想告诉你一个秘密,其实算法可以帮你来找对象。

迈克尔·特力克(卡内基·梅隆大学的运筹学教授)在研究生时期,为了寻觅妹子就经历过这个苦恼(如果找到一个妹子就结婚,万一后面还有更好的呢)。当时青春懵懂的迈克尔突然明白,这不就是一个 37% 法则的算法问题么?

首先迈克尔估算出这辈子能谈多少次恋爱,用 N 来表示。假设从 18岁 就开始谈恋爱,可以谈到 32 岁,2年谈一次,那么 N =(32 - 18)/ 2 = 7 次;

接着算出临界点 M = N × 37% 。那么此时 M = 7 × 37% = 2.59 ≈ 2次;

最后开始执行策略,前 M 个恋爱对象统统放弃只做观察,后面只要遇到比前 M 个好的人,就定下来。在这个案例中,就是前 2 个恋人只做观察,从第 3 个开始,只要比前 2 个好,就确定关系。

正如迈克尔设定的算法,他发现一个妹子比以前认识的都优秀,于是果断出手。然而理想很丰满现实很骨感,迈克尔采用的找妹子算法没有考虑到妹子拒绝的情况,毕竟爱情是俩情相悦的事情(哈哈),妹子无情的拒绝了他。

迈克尔说:“我不知道她会不会是完美的妻子,但是毫无疑问,她符合算法的所有条件。”

正如上面这个找妹子算法,生活中还有很多有趣的算法应用,例如妖怪与和尚过河问题,华容道游戏,数独问题,寻找路径问题,俄罗斯方块游戏,棋类游戏问题等等。

怎么样?听起来是不是非常有趣,这下闷骚 Boy 是不是蠢蠢欲动了呢?


还是要学算法

想要拿到心仪的 offer 需要算法;

不想做 CRUD Boy 也要懂算法;

找到最好的妹子的也要懂算法;

好吧,最终我还是要劝你学学算法。但是算法究竟该怎么学呢,有兴趣的同学欢迎置顶关注我,我会将这段时间算法学习的经验一一分享出来,并且夹杂着在大厂面试中遇到的各类算法题,一一破解。

来吧,一起学习。

感谢你的阅读,我为你准备了一份《高级 Java 面试指南》,点击在看,关注公众号,回复 "礼物" 获取。

往期精彩

1 分钟看穿零拷贝技术,看不懂你打我

为什么 Java 程序员必须要懂类加载机制?

高级 Java 面试必问的三大 IO 模型,你 get 了吗?

细嚼慢咽 Java 线程池,你品你细品

分享一道美团一面的面试题,简单又细腻

final 这道送分题,你答对了吗?

面试官问我 volatile 是否存在伪共享问题?我懵逼了

Java 垃圾回收器很难?是你学的方法不对

当我们在谈论内存时,我们在谈论什么

聊聊 Java 的几把 JVM 级锁

"在看" 是最大的支持

你可能感兴趣的:(面试了一个月,到底要不要刷算法?我有了答案)