35 lines
830 B
Go
35 lines
830 B
Go
package q636
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func exclusiveTime(n int, logs []string) []int {
|
|
ret := make([]int, n)
|
|
stack := make([][3]int, 0, 256) // proc id, start time, child exec time
|
|
|
|
for i := range logs {
|
|
fields := strings.FieldsFunc(logs[i], func(r rune) bool { return r == ':' })
|
|
id, _ := strconv.ParseInt(fields[0], 10, strconv.IntSize)
|
|
action := fields[1]
|
|
curTime, _ := strconv.ParseInt(fields[2], 10, strconv.IntSize)
|
|
|
|
switch action {
|
|
case "start":
|
|
stack = append(stack, [3]int{int(id), int(curTime), 0})
|
|
case "end":
|
|
i := len(stack) - 1
|
|
id, stT, chT := stack[i][0], stack[i][1], stack[i][2]
|
|
ret[id] += int(curTime) - stT + 1 - chT
|
|
|
|
if len(stack) > 1 {
|
|
stack[i-1][2] += int(curTime) - stT + 1
|
|
}
|
|
stack = stack[:len(stack)-1] // pop
|
|
}
|
|
}
|
|
return ret
|
|
}
|
|
|
|
var _ = exclusiveTime
|