有一个 单线程 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函数它自己执行了几秒
leetcode636. 函数的独占时间
最新推荐文章于 2024-10-06 20:16:20 发布