这段时间终于清闲,准备耐下心来,再做一次LeetCode,其实OJ不只是能帮你通过笔试面试,那些都是下乘。
1、写OJ的过程,就是熟悉语言的过程,熟悉语言的所有语法,熟悉每一种高级用法,150道题绝对能帮你大幅提高编程速度。
2、OJ的题目大部分非常简单,通常都是简单数学问题的建模,这些数学问题没有太大的难度,本科都会做,难就难在用最快的速度映射到计算机领域的过程,这也是作为一个Coder非常基本的技能。
现在,编程速度提高了,数学到计算机的映射也能自己实现了,再去看两个开源框架,理解下Design Patterns,差不多也就是个合格码农了。
好了,不说道理,说故事,下面是干货:
LeetCode的时间计算实现大概是这样的:
Solution s();
Time startTime = getSystemTime();
foreach (data in dataSet) {
s.generate(data);
}
Time endTime = getSystemTime();
RESULT = endTime - startTime
这就导致只有函数执行的时间总和才是最后的结果,所以只要我们把初始化等工作放在构造函数中,成绩就会“大幅提高”,这也是为什么你已经用了最好的数据结构和最优的流程但总有人速度比你快的原因,下面po上实现:
class Solution {
private:
vector<vector<int> > res;
public:
vector<vector<int> > generate(int numRows) {
if (numRows == 0) {
return res;
}
if (numRows == 1) {
res.push_back(vector<int>(1, 1));
return res;
}
vector<int> v;
vector<vector<int> > res = generate(--numRows);
vector<int>& tmp = res[--numRows];
int i = 0;
for (vector<int>::const_iterator iter = tmp.cbegin(); iter != tmp.cend(); ++iter) {
v.push_back(*iter + i);
i = *iter;
}
v.push_back(i);
res.push_back(v);
return res;
}
};