leetcode636. 函数的独占时间

有一个 单线程 CPU 正在运行一个含有 n 道函数的程序。每道函数都有一个位于  0 和 n-1 之间的唯一标识符。

函数调用 存储在一个 调用栈 上 :当一个函数调用开始时,它的标识符将会推入栈中。而当一个函数调用结束时,它的标识符将会从栈中弹出。标识符位于栈顶的函数是 当前正在执行的函数 。每当一个函数开始或者结束时,将会记录一条日志,包括函数标识符、是开始还是结束、以及相应的时间戳。

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

函数的 独占时间 定义是在这个函数在程序所有函数调用中执行时间的总和,调用其他函数花费的时间不算该函数的独占时间。例如,如果一个函数被调用两次,一次调用执行 2 单位时间,另一次调用执行 1 单位时间,那么该函数的 独占时间 为 2 + 1 = 3 。

以数组形式返回每个函数的 独占时间 ,其中第 i 个下标对应的值表示标识符 i 的函数的独占时间。

 

示例 1:

/**
 * @param {number} n
 * @param {string[]} logs
 * @return {number[]}
 */
var exclusiveTime = function(n, logs) {
    // 记录每个任务花费的时间
    let res = new Array(n).fill(0);
    // 代表执行第几个任务,首先执行0任务
    let go = 0;
    function next(){
        // 记录子任务花费的时长
        let dure = 0;
      // 当前任务通过分隔符 一个命令分成三步,时间,任务号,执行的开始和结束 【0  : start : 0】
        const start = logs[go].split(':');
      // 只要没执行到最后一个任务,并且 当前任务的下一个任务不等于 -1,
  
        while(go < logs.length - 1 && logs[go + 1].indexOf('s') !== -1){
         //代表下一个任务还是启动任务,start, 那要 执行下一个任务,因为当前任务执行了下一个任务
            go++;
          // 当前时长 是当前时长加上下面的时长
            dure = dure + next();
        }
      // 如果没进这个循环,代表 下一个任务是结束任务,
        const end = logs[++go].split(":");
      //。求任务时长之和 = 终点位置 - 起始位置, 如果任务里面有子任务还需要减去 du re 还要减去子任务时长
        let sum = Number(end[2]) - Number(start[2]) + 1 - dure;
      // 把时长存到数组里面,第0个位置是时间位,因为这个方法会被多次调用,所以在数组里就存了时间,
      //所以取到在数组中的时间加上净时间
        res[Number(start[0])] = res[Number(start[0])] + sum;
     			// 净时间
        return sum + dure;
    }
    while(go < logs.length){
        next();
        go++;
    }
    return res;

}; 
// 有这么两个函数  0函数 1函数

// 然后在0s 的时候 先调用 0函数 

// 0s  0s 的时候 先调用 0函数 (执行完用了两秒)

// 2s 0函数 调用1函数,1函数执行完用了5秒

// 5s 执行完毕,给0函数返回了一个结果

// 10s 0函数在第6秒完成了执行;

// 问我们0函数它自己执行了几秒,1函数它自己执行了几秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值