跳到主要内容

636.函数的独占时间

链接:636.函数的独占时间
难度:Medium
标签:栈、数组
简介:给出一个非抢占单线程 CPU 的 n 个函数运行日志,找到函数的独占时间。

题解 1 - typescript

  • 编辑时间:2021-03-20
  • 执行用时:116ms
  • 内存消耗:42.8MB
  • 编程语言:typescript
  • 解法介绍:利用栈维护函数运行过程。
function exclusiveTime(n: number, logs: string[]): number[] {
const ans = new Array(n).fill(0);
const stack: number[] = [];
for (let i = 0, l = logs.length, pre = 0; i < l; i++) {
const info = logs[i].split(':');
const id = Number(info[0]);
const tag = info[1];
const time = Number(info[2]);
if (tag === 'start') {
if (stack.length !== 0) ans[stack[stack.length - 1]] += time - pre;
pre = time;
stack.push(id);
} else {
ans[id] += time - pre + 1;
pre = time + 1;
stack.pop();
}
}
return ans;
}

题解 2 - cpp

  • 编辑时间:2022-08-07
  • 执行用时:12ms
  • 内存消耗:13MB
  • 编程语言:cpp
  • 解法介绍:stack。
class Solution {
public:
typedef pair<int, int> node;
vector<int> exclusiveTime(int n, vector<string>& logs) {
vector<int> list(n, 0);
stack<node> s;
for (auto &item : logs) {
bool isStart;
int idx = 0, time = 0;
analysis(item, idx, isStart, time);
if (s.size()) {
if (isStart) {
node top = s.top();
list[top.first] += time - top.second;
s.push(make_pair(idx, time));
} else {
node top = s.top(); s.pop();
list[top.first] += time - top.second + 1;
if (s.size()) {
top = s.top(); s.pop();
top.second = time + 1;
s.push(top);
}
}
} else {
s.push(make_pair(idx, time));
}
}
return list;
}
void analysis(string &item, int &idx, bool &isStart, int &time) {
int i = 0;
for (; item[i] != ':'; i++) idx = idx * 10 + item[i] - '0';
i++;
string temp = "";
for (; item[i] != ':'; i++) temp += item[i];
isStart = temp == "start";
i++;
for (; i < item.size(); i++) time = time * 10 + item[i] - '0';
}
};