// 0636. Exclusive Time of Functions
class Solution {
public int[] exclusiveTime(int n, List<String> logs) {
int[] ans = new int[n];
Stack<LogObject> stack = new Stack<>();
for (String log : logs) {
LogObject logObject = new LogObject(log);
if (stack.empty()) {
stack.push(logObject);
} else if (logObject.isStart) {
ans[stack.peek().functionId] += logObject.timestamp - stack.peek().timestamp;
stack.push(logObject);
} else {
ans[stack.peek().functionId] += logObject.timestamp - stack.peek().timestamp + 1;
stack.pop();
if (!stack.empty()) {
stack.peek().timestamp = logObject.timestamp + 1;
}
}
}
return ans;
}
}
class LogObject {
int functionId;
boolean isStart;
int timestamp;
LogObject(String s) {
this.functionId = Integer.parseInt(s.substring(0, s.indexOf(':')));
this.isStart = s.substring(s.indexOf(':') + 1, s.lastIndexOf(':')).equals("start");
this.timestamp = Integer.parseInt(s.substring(s.lastIndexOf(':') + 1));
}
}
学习笔记:
这是一道栈的题目,也用到了切割字符串。
这里我选择使用了创建类和转化成对象的思路来做,本来以为会导致时间和空间升高,没想到
执行用时:9 ms, 在所有 Java 提交中击败了95.92%的用户
内存消耗:41.7 MB, 在所有 Java 提交中击败了96.55%
这样写出来代码又好看又好懂真是太妙了。
这道题的难点是用栈后的五种情况,栈是不是空了,id是否一样,开关是否一样。在遇到各种情况需要怎么处理,是压栈还是出栈还是是结算,最后发现其实只有三条分支。