让我详细地讲解一下Java C++题解LeetCode 1598文件夹操作日志搜集器的完整攻略。
简介
这是一道LeetCode的题目。题目描述为:假设您正在设计一款简单的奇怪编辑器,每次打开它时,编辑器都会仅显示全部文本中最后一次输入的字符。执行一些操作后,您希望能够查看并恢复到某些之前的状态。为了实现这个功能,您需要设计一个操作日志记录数据结构。该数据结构将保存每个操作(仅三种:下面详细讲解),以及实施该操作时文件夹的实际名称。
题目要求实现一个函数,它将读取操作日志,并返回最后计算机文件夹的名称。
操作类型
题目中的操作有三种。
./
: 这个操作表示当前目录,不需要进行任何操作。../
: 这个操作表示返回上一级目录。x/
: 这个操作表示进入到x目录。
解题思路
解题的主要思路是建立一个栈来保存目录历史。如果遇到当前目录./
,则不做任何处理。如果遇到返回上一级目录../
,则弹出栈顶元素。如果遇到进入下一级目录x/
,则将目录入栈。
最后栈中剩下的就是最后的目录名称。
实现代码
下面是Java实现代码:
class Solution {
public String findFolder(String[] logs) {
Stack<String> stack = new Stack<>();
for (String log : logs) {
if (log.equals("./")) {
// 当前目录,不做任何处理
} else if (log.equals("../")) {
// 返回上一级目录
if (!stack.empty()) {
stack.pop();
}
} else {
// 进入下一级目录
stack.push(log);
}
}
StringBuilder sb = new StringBuilder();
for (String s : stack) {
sb.append('/');
sb.append(s);
}
return sb.length() == 0 ? "/" : sb.toString();
}
}
下面是C++实现代码:
class Solution {
public:
string findFolder(vector<string>& logs) {
stack<string> st;
for (string log : logs) {
if (log == "./") {
// 当前目录,不做任何处理
} else if (log == "../") {
// 返回上一级目录
if (!st.empty()) {
st.pop();
}
} else {
// 进入下一级目录
st.push(log);
}
}
string ans = "";
while (!st.empty()) {
ans = "/" + st.top() + ans;
st.pop();
}
return (ans == "") ? "/" : ans;
}
};
示例
下面是两条示例:
示例 1:
输入:logs = ["d1/","d2/","../","d21/","./"]
输出:"d1/d21"
解释:第一条操作将进入名为“d1”的目录。第二个操作将进入名为“d2”的目录。然后,第三个操作将返回上一个目录,返回到“d1”。逐步地,我们进入“d21”目录,然后我们执行了操作“./”,没有任何更改。因此,最后的目录名称为“d1/d21”。
示例 2:
输入:logs = ["d1/","d2/","../","../","d21/","./"]
输出:"d21"
解释:第一个操作将进入名为“d1”的目录。然后,我们进入名为“d2”的目录。然后,我们返回上一个目录,回到“d1”。接下来,我们返回到上一个目录,回到初始目录。然后,我们进入名为“d21”的目录,最后我们执行了操作“./”,没有任何更改。因此,最后的目录名称为“d21”。
希望我的解答能够对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java C++题解leetcode1598文件夹操作日志搜集器 - Python技术站