1. 程式人生 > >636. Exclusive Time of Functions

636. Exclusive Time of Functions

str () strings unique cal style gin col pre

問題描述:

Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU, find the exclusive time of these functions.

Each function has a unique id, start from 0 to n-1. A function may be called recursively or by another function.

A log is a string has this format : function_id:start_or_end:timestamp

. For example, "0:start:0" means function 0 starts from the very beginning of time 0. "0:end:0" means function 0 ends to the very end of time 0.

Exclusive time of a function is defined as the time spent within this function, the time spent by calling other functions should not be considered as this function‘s exclusive time. You should return the exclusive time of each function sorted by their function id.

Example 1:

Input:
n = 2
logs = 
["0:start:0",
 "1:start:2",
 "1:end:5",
 "0:end:6"]
Output:[3, 4]
Explanation:
Function 0 starts at time 0, then it executes 2 units of time and reaches the end of time 1. 
Now function 0 calls function 1, function 1 starts at time 2, executes 4 units of time and end at time 5.
Function 0 is running again at time 6, and also end at the time 6, thus executes 1 unit of time. 
So function 0 totally execute 2 + 1 = 3 units of time, and function 1 totally execute 4 units of time.

Note:

  1. Input logs will be sorted by timestamp, NOT log id.
  2. Your output should be sorted by function id, which means the 0th element of your output corresponds to the exclusive time of function 0.
  3. Two functions won‘t start or end at the same time.
  4. Functions could be called recursively, and will always end.
  5. 1 <= n <= 100

解題思路:

主要思路:

  要記錄上一個log的相關參數,與當前log相比較,在這裏我的關註重點為可能的出現的狀態:

    a. start start: 可能出現在前後兩個不同的任務中,我們應當把時間差加到前面一個的任務中

    b. start end:出現在同一個任務中,時間差計算為:end - start + 1,因為還要算上start的1個時間單位

    c. end end:可能出現在兩個不同的任務中,應當把時間差加到後面一個任務中

    d. end start: 可能出現在兩個不同任務中,需要註意的是,此時時間差不一定為1,那麽這段時間應該是最近一個還沒有結束的任務在占用。

為了保證d的情況,我們用棧來記錄當前正在運行的任務。

需要註意的是:

一定要保證出棧入棧成雙成對!

代碼:

class Solution {
public:
    vector<int> exclusiveTime(int n, vector<string>& logs) {
        vector<int> ret(n, 0);
        if(logs.empty())
            return ret;
        stack<int> stk;
        int prev_id = -1;
        string prev_state = "start";
        int prev_time = 0;
        for(string s : logs){
            stringstream ss(s);
            string temp;
            getline(ss, temp, :);
            int id = stoi(temp);
            getline(ss, temp, :);
            string cur_state = temp;
            getline(ss, temp, :);
            int t = stoi(temp);
            if(prev_id != -1){
                if(cur_state != prev_state){
                    if(cur_state == "end"){
                        ret[id] += (t - prev_time + 1);
                        stk.pop();
                    }else{
                        int time_diff = t - prev_time;
                        if(time_diff > 1 && !stk.empty()){
                            ret[stk.top()] += time_diff - 1;
                        }
                        stk.push(id);
                    }
                } else{
                    if(cur_state == "start"){
                        ret[prev_id] += t - prev_time;
                        stk.push(id);
                    }
                    else{
                        ret[id] += t - prev_time;
                        stk.pop();
                    }
                }
            }else{
                stk.push(id);
            }
            prev_state = cur_state;
            prev_id = id;
            prev_time = t;
        }
        return ret;
    }
};

636. Exclusive Time of Functions