0
点赞
收藏
分享

微信扫一扫

636. 函数的独占时间


给你一个由日志组成的列表 logs ,其中 logs[i] 表示第 i 条日志消息,该消息是一个按 "{function_id}:{"start" | "end"}:{timestamp}" 进行格式化的字符串。例如,"0:start:3" 意味着标识符为 0 的函数调用在时间戳 3 的 起始开始执行 ;而 "1:end:2" 意味着标识符为 1 的函数调用在时间戳 2 的 末尾结束执行。注意,函数可以 调用多次,可能存在递归调用 。


 

636. 函数的独占时间_java

示例 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;




    }
}

举报

相关推荐

0 条评论