leetcode 636
题目简介
计算一个函数的独占时间,可看到如下示例:
输入:
n = 2
logs =
[“0 : start : 0”,
“1 : start : 2”,
“1 : end : 5”,
“0 : end : 6”]
输出:[3, 4](PS:这里的空格都是没有的,不然到时候读取时会将空格读入)
说明:
函数 0 在时刻 0 开始,在执行了 2个时间单位结束于时刻 1。
现在函数 0 调用函数 1,函数 1 在时刻 2 开始,执行 4 个时间单位后结束于时刻 5。
函数 0 再次在时刻 6 开始执行,并在时刻 6 结束运行,从而执行了 1 个时间单位。
所以函数 0 总共的执行了 2 +1 =3 个时间单位,函数 1 总共执行了 4 个时间单位。
题目思想
我们需要做的有两点:(1)读入某个函数的开始时间(2)依次获取函数的状态
其实这题是非常适合栈的,毕竟一个函数是必须运行完了才能结束,而且不会有先开始先停止的问题出现,所以一旦开始一个新的函数就把他的id入栈,一旦他结束就出栈,可以说是为栈量身定做的了
(1)读入函数开始时间:由于在vector< string >中并没有split(切片)函数,于是我们需要自己做一个利用string可以直接在末尾添加值的特性输入的logs根据:(冒号)分成三段,第一、三段是开始的时刻,第二段表示此函数是开始还是结束
(2)依次获取函数的状态:由于这个是函数的独占时间,所以当A函数正在运行中时,B函数开始运行那么A函数的时间计算需要停止,那么我们需要用一个答案数组来存放每次函数状态变化的时间长短
AC代码
class Solution {
public:
vector<string> split(const string& s, char sp) {
vector<string> v;
string t;
for (auto c : s) {
if (c == sp) {
if (!t.empty()) {
v.push_back(t);
t.clear();
}
} else {
t += c;
}
}
if (!t.empty()) v.push_back(t);
return v;
}
vector<int> exclusiveTime(int n, vector<string>& logs) {
stack<int> st;
vector<int> res(n, 0);
int prev_t = -1;
for (auto& s : logs) {
auto items = split(s, ':');
int id = stoi(items[0]);
int t = stoi(items[2]);
++res[id];
if (!st.empty() && prev_t != -1) {
res[st.top()] += t - prev_t - 1;
}
if (items[1] == "start") {
st.push(id);
} else {
st.pop();
}
prev_t = t;
}
return res;
}
};
(PS:这是直接拉的题解,对于某些地方需要自己备注一下,毕竟对于方法知晓,但是实际实现终究还是还有一点差距,不知道用什么函数可以)
代码学习
stoi():参数为const string,目的是将数字字符串转化为int类型
还有一个与他相似的代码就是atoi(),参数类型为const char,作用是像数字字符转化为int类型
对于vector< string >其实和之前文章中的vector< int >相似,只是向搜索函数变成了find函数,用法相似(PS:本来想用这个的,因为find函数返回的是下标,但是这个里面有两个:(冒号)所以一时脑梗就觉得还是用string的末尾增加特性比较好)