某位工业界的朋友谈到最近刷leetcode有点累, 遂和我探讨刷题的问题.
我感觉, 刷题是参加竞赛的同学的主业, 拼手速拼熟练程度, 要打怪自然要勤刷. 业精于勤而荒于嬉, 这是一个自然的道理. 为何中国乒乓球队长盛不衰? 就是因为他们天天刷高精尖的动作, 而且战术上又有多年传承, 前三板对手的所有变化基本都算在脑海中, 这样能不赢吗?
但是进入职场的朋友为何不要这样刷题呢? 我谈一些自己的浅见, 或者说什么才是真正的刷算法:
- 算法题很多是人造题, 应用场景不够. 许多特定限制的题, 规定了数据的形态和范围, 但是这样的题在每天写的代码中根本看不到, 也没有刷的必要. 就比如说没事做一些绕来绕去的小学奥数题, 这样对数学思维没有什么太大的锻炼价值.
- 有些技术是屠龙之术, 看似很美好但根本用不着. 就比如说在单链表中删除当前结点用后一个结点来代替(实际上删除的是后一个结点), 这种技术实在没什么太大意义. 而且, 它没法删除链尾结点啊!
- 业务逻辑简化更重要. 有刷算法题的时间, 不如把今天写的代码再精简重构一下. 用一下数理逻辑的技术, 简化或者合并逻辑判断, 让代码更清晰可读并且没有逻辑错误, 这样岂不是更好吗? 所以, 多写一点Solid Code吧!
- 多看点算法书. 很多人连哪个渐近记号更快都没有搞清楚, 就急着去刷题, 这样也是不合适的. 看懂这个是基本要求, 你连这个都不懂如何进步呢?
- 结合实际场景建立模型. 现实中的难题, 重要的是要将它转换到某个算法问题上去, 然后再去寻找现有的解决方案. 最简单的例子就是, 反正大多数人也写不好红黑树, 何不老老实实用
set
容器呢? 当然, 这里安利一本我翻译的《算法设计指南》(The algorithm design manual), 多看看这本书能让你找到很多算法问题.