解题思路
说人话就是,当前有一个进程在执行,如果有下一个进程要过来执行,就暂停当前这个进程的执行,最后计算每一个进程的执行时间。
那就用一个栈来模拟进程的执行,如果有一个进程过来要执行,那就暂停现在正在执行的进程,计算现在正在执行的进程已经执行的时间,记录下来;
如果现在进程执行结束了,那就把它从栈里面弹出来,然后计算它现在执行了多长时间,更新它自己的时间,然后把栈顶的下一个进程重新开启(也就是把执行的开始时间设置为当前的进程的结束时间+1)。
依次处理所有的进程就可以了。
代码
class Solution {
public int[] exclusiveTime(int n, List<String> logs) {
int[] ans=new int[n];
Stack<int[]> stack =new Stack<>();
for (int i=0;i<logs.size();i++){
String[] split = logs.get(i).split(":");
int flag=Integer.parseInt(split[0]);
int time=Integer.parseInt(split[2]);
if (split[1].equals("start")){
if (!stack.empty()){
ans[stack.peek()[0]]+=time-stack.peek()[1];
}
stack.push(new int[]{flag,time});
}else {
int[] t = stack.pop();
ans[flag]+=time-t[1]+1;
if (!stack.empty()){
stack.peek()[1]=time+1;
}
}
}
return ans;
}
}