636. Exclusive Time of Functions

2020-04-19  本文已影响0人  微微笑的蜗牛

@(LeetCode)

问题描述

我们将在一个单线程 cpu 上执行一些函数。每个函数有个唯一 id, 范围是 [0, N-1]

我们按时间顺序存储日志,这些日志描述了函数进入或退出的时机。

每个日志是个字符串,其格式为:{function_id}:{"start" | "end"}:{timestamp}

举个栗子,"0:start:3" 表示函数 0 在时间戳为 3 时启动。"1:end:2" 表示函数 1 在时间戳为 2 的时候停止。

一个函数的独占执行时间是指在该函数上花费的时间片。注意函数没有递归调用或者调用子函数。

CPU 是单线程的,意味着在一个时间片中只能执行一个函数。

要求按照函数 id 顺序,返回每个函数的独占执行时间。

栗 1:

WX20200419-143646@2x.png
输入:
n = 2
logs = ["0:start:0","1:start:2","1:end:5","0:end:6"]

输出:[3, 4]
解释:
函数 0 在 0 时启动,它会执行 2 个时间片;
函数 1 在 2 时启动,在 5 时结束,执行了 4 个时间片;
函数 0 在 6 时结束,执行了 1 个时间片。
因此,函数 0 总共执行时间为 2 + 1 = 3,函数 1 的时间为 4。

注意:

  1. 1 <= n <= 100
  2. 两个函数不会在相同的时间点开始或结束。
  3. 当函数退出时,也会打印日志。

想看英文原文的戳这里

解题思路

首先梳理一下题意:

另外还有重要的一点:

同一个函数可能被 start 多次。

这是我在提交代码出错后,看它的测试用例才知道。此时才发现原来我的解法完全的错了。

初始想法

由于没有考虑到一个函数会被 start 多次,因此按照常规的思路,将每个函数执行的开始/结束时间存下来,然后判断是否在其他函数执行时间段内,来计算真正的执行时间。

但提交代码时,傻眼了,原来还有多次 start 的情况。那么这种解法完全不行。

正确思路

由于日志是按时间顺序排列的,那么我们按照这个顺序去遍历就好。

但是遍历时,前后函数 log 可能存在的情况较多,假设前一个函数的时间戳为 t1,后一个函数的时间戳为 t2。具体情况如下:

通过分析上述情形,我们可以得出:

按照各种不同的情况,将对应函数的执行时间片进行累加即可。

完整代码可点此查看

case 简化

以上分析的各种情形有点复杂,其实并不用细化到那么多场景。只需要判断当前的日志是 start 还是 end 即可。

python 代码如下:

def exclusiveTime(self, N, logs):
    ans = [0] * N
    stack = []
    prev_time = 0

    for log in logs:
        fn, typ, time = log.split(':')
        fn, time = int(fn), int(time)

        if typ == 'start':
            if stack:
                ans[stack[-1]] += time - prev_time 
            stack.append(fn)
            prev_time = time
        else:
            ans[stack.pop()] += time - prev_time + 1
            prev_time = time + 1

    return ans

具体代码可点此查看

上一篇下一篇

猜你喜欢

热点阅读