给你一个由日志组成的列表 logs ,其中 logs[i] 表示第 i 条日志消息,该消息是一个按 "{function_id}:{"start" | "end"}:{timestamp}" 进行格式化的字符串。例如,"0:start:3" 意味着标识符为 0 的函数调用在时间戳 3 的 起始开始执行 ;而 "1:end:2" 意味着标识符为 1 的函数调用在时间戳 2 的 末尾结束执行。注意,函数可以 调用多次,可能存在递归调用 。
示例 5:
输入:n = 1, logs = ["0:start:0","0:end:0"]
输出:[1]
这个题也是有一点难度的, 就是逻辑要理清楚
class Solution {
public int[] exclusiveTime(int n, List<String> logs) {
/**
遇到start入栈, end 出栈
顶部的就是正在运行的
让pre表示上一个线程的运行时间,初始为第一个线程的start时间
如果读取下一个log 为start 则说明有新的线程进来,加入栈顶 上一个线程运行了pre=两个start之差 , 更新上一个线程的res,还没结束 ,还得加上后面继续运行的
如果下一个log是end,说明当期进程结束,出栈,更新当前进程运行了end-prev+1, 上一个线程继续执行,pre=当前end的时间+1
*/
Stack<Integer> stack=new Stack();
int [] res=new int[n];//存放答案
String s1 []=logs.get(0).split(":");//把第一个日志分开
int pre=Integer.parseInt(s1[2]); //初始为第一个线程的start时间
int i=1;
stack.push(Integer.parseInt(s1[0]));//放入第一个线程id
while(i<logs.size()){
String s []=logs.get(i).split(":");
if(s[1].equals("start")){
//更新上一个线程的res和 pre
if(!stack.isEmpty())
res[stack.peek()]+=Integer.parseInt(s[2])-pre;
pre=Integer.parseInt(s[2]);
//有新线程加入,放到栈顶
stack.push(Integer.parseInt(s[0]));
}else{
//更新当前线程的res和 pre
if(!stack.isEmpty())
res[stack.peek()]+=Integer.parseInt(s[2])-pre+1;
pre=Integer.parseInt(s[2])+1;
//出栈
stack.pop();
}
i++;
}
return res;
}
}