本题是树形(森林)结构上的设计题:每个 span 至多有一个父节点;inherit=false 时开新根,形成多棵树并存。
维护:
parent / children:父子关系;order:进入顺序列表(仍存活的 span);latest:当前最新 span(即 order 末尾)。请实现一个简易日志系统,主要功能如下:
LogSystem() — 系统初始化,当前无任何 span。
span:用来描述一个操作或事件的时间跨度,可进入或离开。
enter(int spanId, bool inherit) — 新进入一个 span,其标识为 spanId;inherit 表示该 span 是否继承最新的 span。
inherit 为 true 且至少有一个 span,则 spanId 成为最新 span 的子;否则,不继承,该 spanId 没有父。spanId 成为最新 span。spanId 全局唯一。log(string msg) — 输出日志。
msg 内容。msg 自身内容。msg 或 1-2-3: msg。leave(int spanId) — 离开标识为 spanId 的 span。
spanId 一定是最新 span 或它的祖先。每行表示一个函数调用,初始化函数仅首行调用一次,累计函数调用不超过 100 次。
1 <= msg.length < 16,0 <= spanId <= 1000
输入:
LogSystem()
log("begin")
enter(1, false)
enter(2, true)
enter(3, true)
enter(5, false)
enter(6, true)
log("first log")
leave(5)
log("second log")
leave(2)
log("third log")
输出:
null
"begin"
null
null
null
null
null
"5-6: first log"
null
"1-2-3: second log"
null
"1: third log"
解释:
LogSystem()
log("begin") // 当前无 span,直接输出
"begin"
enter(1,false)
enter(2,true)
enter(3,true)
enter(5,false) // 不继承,5 成为最新
spanId,且无父
enter(6,true)
log("firstlog") // 最新 span 为 6,父为
span5,所以显示为 5-6: first log
leave(5) // 离开 span 5,其子 span 6 也被删除,最新 span 为 3
log("secondlog")
leave(2) // 离开 span 2,其子 span 3 也被删除,最新 span 为 1
log("thirdlog")
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.