引子
最近朋友让我分享一下刷了1年半算法的感悟,所以就来了。 最近朋友给我说让我不要学 node, 学 go,学 cpp, 高大上而且更偏向服务端,而 node 作为一个运行时,还是用 JS 写代码,没啥意思。然后我结合了一下我学算法的思考,就有了这么一篇感想了。
Note
- 本文只适合初级程序员食用,如果能灵活使用各种技巧的大佬请忽略,这只是一个老菜鸟飞行几十米的经验而已,和鹏程万里差十万八千里。
- 如果你是一个初入算法的小白,其实也能收获一点点... 湿货的吧。
正文
我为什么坚持认为前端应该用 JS 刷算法呢
言归正传,为什么我认为前端该用 JS 刷算法呢?因为我只会 JS 啊。
有什么就用什么,是一个很简单的道理,易用性也是程序员在使用工具时着重考虑的指标之一,辣么怎么到了使用啥语言工具刷算法的时候,会问出 用啥语言刷算法比较好?, 作为前端,我是否应该学一下 java或者go或者cpp 去刷算法呢?
我是一名转行的前端,以前连计算机二级都没过,考 C 的时候连数据类型都傻傻分不清,所以当我成了一名光荣的前端切图仔后,我就有且仅有一门 JS 语言可用了,不用它用啥?
前端刷算法到底是为了啥?
我们在讨论一个事件的时候,一般会溯源这个事件的提出场景,考虑这个解决这个事件的解决办法。那么问题来了,前端学算法到底是为了什么?你那么努力的刷 LC,是为了啥?
最现实的回答就是,为了面试大厂。对于万物皆可卷的互联网圈,作为互联网娱乐圈中心的前端,切图仔们不单单要对像素细扣,还得要学算法了。。。如果你说你作为一个前端学算法是为了打比赛,以后转算法,转xx,那么请离开,我们大前端不香嘛。。。
所以为了面试而学算法的我们,就要考虑一下,面试考算法到底为了什么?或者说,面试官要如何通过算法来发现你的能力。
- 我会一题多语言解,分别用 go, py, cpp, java 都写一遍,然后面试官倒头就拜,竟然是多语言全干大佬,那么我们来聊聊多进程复用等细节吧
- 我用 JS 完成基础写法,然后对于很多细节都用 JS 语言特性解决(记得最好加点注释,著名用了什么特性,比方说工厂模式创建的数组,往里面加 item 就不需要扩容,所以就是不用 new Array(len) 做限制);面试官大惊,JS 的骚操作都会了,看来是个
抗压耐寂寞的小伙子。
所以其实在算法中就可以尽量展示自己对于 JS 这门前端最重要技能,同样是遍历数组求和,你会用 reduce 去处理吗?同样是使用 hash 保存,你会去用 map 并对它的 api 熟悉使用吗?
我认为在面试做题的时候,并没有说必须要做到最优解才是面试官想要的,你在不经意间用到的方法,其实就反应了你平时工作中都使用了啥方式,有没有考量好。毕竟面试官很难问你,map 是什么,有什么 api,你怎么使用啊。。
前端使用 JS 学算法还有啥好处呢?
上文讲的是专注于面试过程写题,引导面试官给你一个熟练使用 JS 的印象。
刷算法还是一个很好学习 JS api 的地方,起码有的时候比在工程上会更好。
这里说的好并不是简单,容易,而是刷算法的时候,会给与你一些限制值,迫使你区分一些 api 方法。
举个栗子,对于数组的切分而言,有 spilce 这样的会影响原数组,也有 slice 这样不影响的,但是在工程上,很多时候我们的数据都是后端取出,然后加点限制切分一样,得到切分后的数组返回即可;而在刷算法的时候,很多时候你的数组是要多次使用的(递归),所以你得考虑你的方法是否会对原数组造成影响。
再比方说有一些方法,刷算法刷多了,即便原理都忘得差不多,但是只要想用就能用起来,比方说 arr.sort((a,b)=>a-b) 就是单增排序,你还需要记忆一下第一个入参大于第二个入参的时候是xxx 吗?
最后,我们经常说单一原则,我们学算法的单一原则就是过面试,那么如果你面的是前端岗位,JS 能力才是你最重要的基础能力之一,所以在准备过程中强化自己最强的能力而不是平均到其他的语言中,难道不香吗?
学习成本
很多大佬说可以多学几门语言,对比着看,会对能力提升很大,这是是无可厚非的。但是前端和后端不一样,很多时候我们真的就是一门 JS 走天下了,JS 对于我们而言不单单只是多门工具之一,而是核心工具,所以能在任何渠道过程强化它,我觉得都值得。
至于学习其他语言来刷题,我觉得大可不必。我如果学习其他语言,肯定不是因为要用它刷题,而是要用它去做它最擅长的东西,比方说 java 处理后台, py 处理大数据等等,刷算法仅仅只是一种消遣罢了;如果为了消遣去学其他语言,我觉得成本太高了。
最后
其实很多前端大佬都写过一些基于 JS 的算法题解,但是慢慢他们都变了;因为他们太强,所以可以兼容多语言并发实现,再发下算法世界里,前端还是少数,所以更愿意把精力投放在市场更大的地方。这里着重@Lucifer--西湖区最强算法,不务正业的前端,做算法题解除了 JS 啥都写,虽然赢得大批粉丝,但是还是被我们这些前端吐槽。
其实看算法题解,并没有说必须要看 JS 写法,只是如果你想在写的过程中,也尽量提升一下 JS 的能力,那么 JS 的写法确实很实诚一点。而且 Java 作为比较主流的题解,但是看的真的比 JS 麻烦多了,还不能抄,所以我就只能坚持用 JS 写题了。
后面打算将写过的题按类型分一下,需要练习的自取,取自 LC 中 HOT100,字节腾讯高频面试题,一些大佬推荐的高频题等。
我写的题解其实很菜,很多时候都不是最优解,你可以点击题目跳到 LC 上找大神解法,而我的题解只是作为一只老菜鸟,尽可能将正确但比较浅的注释给到你,希望对刚入门刷算法的前端同学有一点帮助。
当然了,市场那么大,找个细分领域是因为能力还差,分享出来也能让自己尽量少错,然后帮到自己搞个 100Star 的项目的同时,希望也能交个朋友嘛。
先贴一下今年刷的题的地址,github 整理后会再更新在这里的。
再见,搬砖。