C ++函数的排他时间

假设在单线程CPU上,我们执行一些功能。现在,每个函数都有一个介于0到N-1之间的唯一ID。我们将按照时间戳顺序存储日志,以描述何时输入或退出函数。

这里的每个日志都是一个字符串,格式为:“ {function_id}:{“ start” |“ end”}:{timestamp}”。例如,如果字符串类似于“ 0:start:3”,则表示id为0的函数在时间戳3的开头开始。“ 1:end:2”表示id为1的函数在时间戳的结尾处结束2.功能的独占时间是此功能花费的时间单位。

因此,如果输入像n = 2且logs = [“” 0:start:0“,” 1:start:2“,” 1:end:5“,” 0:end:6“],那么输出将为是[3,4]。这是因为函数0在时间0的开始处开始,然后执行2个时间单位并到达时间1的结束。该函数1在时间2的开始处开始,执行4个时间的单位并在时间5结束。 。功能0在时间6的开始处再次运行,并在时间6的结束处结束,因此执行1时间单位。因此,我们可以看到函数0花费2 + 1 = 3个单位的总执行时间,而函数1花费4个单位的总执行时间。

为了解决这个问题,我们将遵循以下步骤-

  • 定义大小为n的数组ret,定义堆栈st

  • j:= 0,前一个:= 0

  • 对于i,范围为0到日志数组大小– 1

    • temp:= logs [i],j:= 0,id:= 0,num:= 0,输入:=空字符串

  • 而temp [j]不是冒号

    • id:= id * 10 + temp [j]作为数字

    • 将j增加1

  • 将j增加1

  • 而temp [j]不是冒号

    • 类型:=类型串联temp [j]

    • 将j增加1

  • 将j增加1

  • 而j <临时大小

    • num:= num * 10 + temp [j]作为数字

    • 将j增加1

  • 如果类型=开始,则

    • 将ret [stack top element]增加num –上一页

    • 如果st不为空

    • 将d插入st,prev:= num

  • 除此以外

    • x:= st的顶部,并删除堆栈的顶部

    • ret [x]:= ret [x] +(num + 1)–上一页

    • 上一页:= num + 1

  • 返回ret

例子(C ++)

让我们看下面的实现以更好地理解-

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<int> exclusiveTime(int n, vector<string>& logs) {
      vector <int> ret(n);
      stack <int> st;
      int id, num;
      int j = 0;
      string temp;
      string type;
      int prev = 0;
      for(int i = 0; i < logs.size(); i++){
         temp = logs[i];
         j = 0;
         id = 0;
         num = 0;
         type = "";
         while(temp[j] != ':'){
            id = id * 10 + (temp[j] - '0');
            j++;
         }
         j++;
         while(temp[j] != ':'){
            type += temp[j];
            j++;
         }
         j++;
         while(j < temp.size()){
            num = num * 10 + temp[j] - '0';
            j++;
         }
         if(type == "start"){
            if(!st.empty()){
               ret[st.top()] += num - prev;
            }
            st.push(id);
            prev = num;
         } else {
            int x = st.top();
            st.pop();
            ret[x] += (num + 1) - prev;
            prev = num + 1;
         }
      }
      return ret;
   }
};
main(){
   vector<string> v = {"0:start:0","1:start:2","1:end:5","0:end:6"};
   Solution ob;
   print_vector(ob.exclusiveTime(2, v));
}

输入项

2
["0:start:0","1:start:2","1:end:5","0:end:6"]

输出结果

[3, 4, ]