[leetCode 636] 函数的独占时间(栈模拟)

解题思路

说人话就是,当前有一个进程在执行,如果有下一个进程要过来执行,就暂停当前这个进程的执行,最后计算每一个进程的执行时间。

那就用一个栈来模拟进程的执行,如果有一个进程过来要执行,那就暂停现在正在执行的进程,计算现在正在执行的进程已经执行的时间,记录下来;

如果现在进程执行结束了,那就把它从栈里面弹出来,然后计算它现在执行了多长时间,更新它自己的时间,然后把栈顶的下一个进程重新开启(也就是把执行的开始时间设置为当前的进程的结束时间+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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值