leetcode-636-函数的独占时间

116 阅读1分钟

image.png leetcode原题

解题思路

  • 创建长度为 n 的数组 res 维护返回值,一个栈维护函数的调用栈

  • 遍历输入的 logs,如果当前日志为开始日志,将该函数的开始时间戳压入栈

  • 如果当前日志为结束日志,则栈顶值记录的是它的开始时间戳,弹出栈顶值,将该函数的运行时间加上本次运行时间(结束时间戳-开始时间戳+1)

  • 将栈中的其他函数的开始时间戳加上本次函数的运行时间,达到对应函数的运行时间减去该函数运行时间的目的

  • 当输入 logs 遍历完成后,res 数组就记录了每个函数的独占时间,返回 res 即可

var exclusiveTime = function(n, logs) {
  // 初始化结果数组
  const res = Array(n).fill(0),
  // 函数调用栈
  stack = [];
  // 遍历日志
  for(let i = 0;i<logs.length;i++){
    let [ind,status,time] = logs[i].split(':');
    ind *= 1;
    time *= 1;
    // 如果为开始日志,将函数开始时间戳压入栈
    if(status==='start') stack.push(time)
    else {
      // 计算函数本次于行时间
      const num = time-stack.pop()+1
      res[ind] += num
      // 处理栈中函数的开始时间戳
      handleStack(num)
    }
  }
  return res;
  // 处理栈中函数开始时间戳,达到对应函数运行时间减去本次函数运行时间的目的
  function handleStack(num){
    for(let i =0;i<stack.length;i++){
      stack[i]+=num;
    }
  }
};