[Leetcode]636. Exclusive Time of Functions

链接:LeetCode636

给一个\(n\)个函数运行记录的log数组,表示非抢占式CPU调用函数的情况,即同时只能运行一个函数。格式为\(id:start\ or\ end:time\),求每个函数占用cpu的总时间。

Input:
n = \(2\)
logs = \(["0:start:0","1:start:2","1:end:5","0:end:6"]\)
Output: \([3, 4]\)

相关标签:
首先要弄明白一点:当遍历到logs中的某个字符串时,无论它是begin还是end,当前位于栈顶的元素都会占用 “当前字符串的timePoint-之前字符串的timePoint”(或+1) 时间。
因为如果当前遍历到的字符串是start,那么栈顶元素就是之前start了还没结束的function,在 当前时间点 和 上一个时间点 之间的这段时间,是被栈顶元素占用的,占用了 “当前字符串的timePoint-之前字符串的timePoint” 时间。
算法的关键在于:拿到上一个log的 start/stop time 设为prev,再拿到当前 log 的 start/stop time ,计算出两个time之间的时间差。这也可以同比为,每次计算一个log的占用时间delta,将栈里面的数都减去delta。

python:

class Solution:
    def exclusiveTime(self, n: int, logs: List[str]) -> List[int]:
        res = [0 for i in range(n)]
        stack = []
        for i,log in enumerate(logs):
            function_id,flag,timestamp = log.split(':')
            function_id,timestamp = int(function_id),int(timestamp)
            if flag == 'start':
                stack.append(timestamp)
            elif flag == 'end':
                delta = timestamp - stack.pop() + 1
                res[function_id] += delta
                stack = [x+delta for x in stack]
        return res

C++:

struct Log{
    int id;
    string status;
    int timestamp;
};

class Solution {
public:
    vector<int> exclusiveTime(int n, vector<string>& logs) {
        vector<int> times(n,0);
        stack<Log> st;
        for (string log:logs){
            stringstream ss(log);
            string temp1,temp2,temp3;
            getline(ss,temp1,':');
            getline(ss,temp2,':');
            getline(ss,temp3,':');

            Log item = {stoi(temp1),temp2,stoi(temp3)};
            if (item.status == "start"){
                st.push(item);
            }
            else{
                int delta = item.timestamp - st.top().timestamp + 1;
                times[item.id] += delta;
                st.pop();

                if(!st.empty()){
                    times[st.top().id] -= delta;
                }
            }

        }
        return times;
    }
};

参考:
leetcode 636. Exclusive Time of Functions
[LeetCode] 636. Exclusive Time of Functions 函数的独家时间

posted @ 2019-11-06 17:26  Jamest  阅读(172)  评论(0编辑  收藏  举报