上一次,很久以前,我当时还是非常非常抵触算法的,和微博上有个图的思路类似,觉得用不同的排序算法来排序 array 是类似知道茴字有几种写法。
然后迫于找工作,开始大量练习 leetcode,于是发现算法其实对于你熟悉 API 还是非常有用的。仅仅做了几个 easy 题,就让我写代码的时候熟练度大大提高了。
再然后,进一步熟悉算法,开始做 medium 和 hard 题,然后对算法有了进一步深入了解,才发现算法真的是夯实基础,锻炼基本功。
确实,平时都是写业务,基本用不到算法,但是有了算法作为你的备选答案,你的视野、思考问题的角度,以及代码质量,都能够有不小的改善。
我最近有三次用到算法的经历。
我在重构一个项目,本来需要写 2 个函数,分别接收一个对象,或者一组对象,当然你可以用遍历,但我后来用递归来处理数组的情。当然,数组不大,所以性能影响可以忽略,但代码看着精炼多了。
我需要对一组日期和对应的值进行处理,这些值之间有某种关联,如果有连续的日期出现这个值,你还要通过这个连续的值生成一个新值。我第一反应,这不是动态规划么,然后就试了一下,诶,动态规划确实好使!要放在以前,我估计完全不知道从何下手。你可能会问为何要在前端做大量运算?那显然我们后端提供的数据有问题么。他们正在改。
我们要排序一个超大数组,60K 多个对象,希望能够 in-place,这样就不会额外创建新的内存空间, 减少内存消耗。我同事手写了一个 quick sort,虽然没写错,但这不搞笑呢么,为什么要手写,而且手写了好几十行,然后我找到一个标准库 api,告诉他,这是 in-place,并且排序算法又不是互斥的,标准库 api 里肯定混合用了很多种算法,根据数据集来做不同的切换,后来做了 jsbench 对比性能,当然标准库 api 完胜。如果不懂算法,你吵架都不知道从何下嘴。
总之呢,想要成为一个更好的程序员,还是要去熟练掌握各种算法的,越多越好。
1
rodjerL 2020-06-09 08:57:23 +08:00 via iPhone
是的,而且时候看框架的源码也会用到某些数据结构和算法,如果不了解回比较吃力
|
2
senup 2020-06-09 09:14:38 +08:00
干这行崇尚的理念不就是技术至上,所以说,多学点总是好的
|
3
zppass 2020-06-09 10:08:06 +08:00
最起码会点算法,数据结构理解好一点找工作真的有帮助。
|
4
Torpedo 2020-06-09 10:23:32 +08:00
我觉得吧,遇到一个算法问题,你要能知道用哪个算法解最好。
至于这个算法的实现,无论怎么做,保证正确即可。 相比这个,更重要的还是代码架构、设计这方面 |
5
pandachow 2020-06-09 10:30:12 +08:00
事实上很多 LeetCode 题就是工作中场景的抽象还原。
|
6
Jooooooooo 2020-06-09 10:47:27 +08:00
肯定比刷抖音强
你再想想 |
7
NCZkevin 2020-06-09 11:00:11 +08:00
编辑距离,kmp,排序在实际开发中用过好几次,多刷点算法绝对是有帮助的
|
8
Ariver 2020-06-09 11:00:47 +08:00
+1
|
9
Perry 2020-06-09 11:01:30 +08:00
确实是这样的
|
10
dswyzx 2020-06-09 11:22:35 +08:00
@Jooooooooo 没刷过抖音
但刷抖音会让你几个小时没有头绪怀疑人生怀疑智商吗 |
11
Donne 2020-06-09 11:34:01 +08:00
学习算法之后,写代码不自觉地就会考虑到性能的问题,这是之前考虑不到的地方。
|
12
Mark24 2020-06-09 11:47:02 +08:00
确实是这样
|
13
maplelin 2020-06-09 11:52:16 +08:00 3
刷 leetcode 确实对于判断边界条件,提高代码质量很有帮助,写的 bug 都比之前少了不少
|
14
skys215 2020-06-09 12:13:37 +08:00
第一篇的链接有吗
|
15
ruyu 2020-06-09 12:31:27 +08:00
脑子太久不用就会生锈
|
16
Jooooooooo 2020-06-09 12:38:52 +08:00
|
17
kera0a 2020-06-09 12:39:26 +08:00 via iPhone
非常非常赞同!
|
18
Perry 2020-06-09 12:43:42 +08:00
不过其实这些算法本科内容都学过,只是刷题能更好地巩固之前学的。
|
19
NtosKiking 2020-06-09 12:48:32 +08:00
之前做过一段时间的 LeetCode 题目,工作中为展示体现父子层级关系功能的时候用到了刷题学到的利用栈进行深度优先遍历的思路。不得不说,多做题学习思考后解决问题的思路会更多。
|
21
daozhihun 2020-06-09 13:20:26 +08:00
刷 lc 肯定是有用的,虽然直接能用到的很少,但还是能培养自己的思维能力和严谨性,在思考别的问题的时候思路会开阔很多
不过我不赞成过度地刷 lc (尤其是某些公司面试喜欢出一些很偏门的问题),那样在考察候选人的时候反而本末倒置了,除非是专门招搞算法的 |
22
yaphets666 2020-06-09 13:32:17 +08:00
我是有一次 我前端做一个表格树 后端提供一个树形数据 但是没有 "合计" 这个时候我就没有头绪 开始明白刷题和学习算法的意义了
|
23
miaomiaoweiwei 2020-06-09 14:03:50 +08:00
是的 非常赞同你的说法 可以开拓思路
|
24
Dogergo 2020-06-09 14:38:20 +08:00
@dswyzx 会,实际上刷抖音,如果你看评论的话,我想不超过 10 分钟,你会认为自己脑子没了,是他们不正常还是自己不正常
|
25
gadsavesme 2020-06-09 14:41:06 +08:00
对于一些从不判断边界值空指针的,还有一些简单的循环树形结构啥的都搞不清楚的,我反正一律都建议可以多刷刷 lc
|
27
LYEHIZRF 2020-06-09 15:08:04 +08:00
当然 学过算法以后 实现代码首先会考虑复杂度
|
28
liuxingdeyu 2020-06-09 16:07:54 +08:00
还有就是,边缘情况考虑的更多了
|
29
lxd152 2020-06-09 19:55:51 +08:00
算法能把你带到不同的高度
|
30
leven87 2020-06-09 20:10:19 +08:00 via iPhone
术业有专攻,基础肯定要有,但多深入看个人。我是看个算法半年肯定忘记的
|
31
lithbitren 2020-06-09 20:12:35 +08:00
竟然能碰到 dp 的场景
|
33
volvo007 2020-06-12 13:07:46 +08:00 via iPhone
最近遇到的问题是最短路径和马尔可夫链,搁以前肯定懵了,估计连用什么模型去解决都不知道。刷完题之后轻松解决,还是很有帮助的
|