和编程相关的事情大致分为四种:
- 实际工作(公司产品代码)
- 研究工作(Project Euler)
- 编程竞赛(POJ)
- 面试准备(Leetcode、Lintcode) 这四种分类,侧重点也不同。
实际工作要考虑产品、市场和公司内部政治斗争等等因素。代码仅仅是手段。编程中侧重可读性,可维护性,鲁棒性。
研究工作侧重可读性。只要结果正确就好。对运行效率,鲁棒性要求不是特别高。
编程竞赛追求极致效率,对可读性要求不高。
面试准备对可读性,复杂度分析有很高的要求。
在Leetcode中: 每个算法,讨论时间复杂度,空间复杂度,额外空间复杂度(扣除输出的空间复杂度)。 指数复杂度的算法,一般不详细讨论复杂度。 bfs、dfs算法,一般不详细讨论复杂度。只讨论搜索策略和局部优化。 对于递归算法,讨论递归深度。
codepad http://codepad.org/