Exclusive Time of Functions

 

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());
	}
};

[1]https://www.cnblogs.com/grandyang/p/7244767.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章