1.解析
題目大意,計算每一個函數執行的時間。
2.分析
題目看起來蠻簡單的,但其實不然,最難理解的部分,就是在"end"狀態這裏,實際上,當檢測到"end"狀態的時候,不只是當前對應的id的函數會執行一個單位的時間,(這裏主要是方便處理而已)上一個函數也會執行一個單位,然後上一個函數執行的起始時間要加1,其他部分就比較容易理解啦,利用一個棧保存當前最新執行的函數id,當檢測到一個新的"start"狀態,說明碰到一個新的函數,放在棧頂。具體實現參考如下:
class Solution {
public:
vector<int> exclusiveTime(int n, vector<string>& logs) {
vector<int> res(n);
stack<int> st;
int idx, cur, pre = 0; //pre----上一個時間 cur----當前的時間
string status;
for (auto log : logs){
divideStr(log, idx, cur, status); //將當前的字符串劃分成函數編號,狀態和時間
if (!st.empty()){ //計算上一個函數的執行時間
res[st.top()] += cur - pre;
}
pre = cur;
if (status == "start"){ //上一個執行的函數交出CPU使用權
st.push(idx); //CPU開始執行現在的函數
}
else{ //檢測到"end"狀態,這步比較難理解
res[st.top()]++;
st.pop(); //執行完上一個函數
pre++; //上一個函數繼續執行,只要CPU空閒,就可以認爲上一個沒有結束的函數在執行
}
}
return res;
}
void divideStr(string log, int& idx, int& cur, string& status) { //引用可以保證返回多個值,劃分字符串
int pos1 = log.find(':');
idx = atoi(log.substr(0, pos1).c_str());
int pos2 = log.find(':', pos1 + 1);
status = log.substr(pos1 + 1, pos2 - pos1 - 1);
cur = atoi(log.substr(pos2+1).c_str());
}
};