第一个leetcode题解,太久没做题上来就脑淤血。。。
解题思路:
这道题要求我们简化路径,只是一道模拟题,注意以下细节即可:
- 首先格式不统一,我们需要在路径结尾加一个"/",比如"/hello"我们改成"/hello",这样可以让我们最后一个字符串能够读完(读取一个单词是要判断是否到了"/")
- 每读完一个字符串,分为4种情况:
- 字符串为".",代表当前路径
- 字符串为"", 代表斜杠连起来了,还是当前路径(只有"/hello//jerry/"这种斜杠连读才会产生空字符串)
- 字符串为"…", 返回上一级目录
- 字符串不是以上三种,进入下一级目录,当前目录 + “/” + 新字符串
- 上面4中情况最复杂的是回退,回退要注意的事情是注意别越界(越界的情况是当前的答案本事是空的,如果回退找最后一个"/??"就会下标为-1)
- 每次处理完要把新字符串置空
- 如果输入的字符串本身是空串或者"/",那答案会为"", 我们应该改成"/"
注意以上的几点直接模拟即可
代码实现:
class Solution {
public String simplifyPath(String path) {
// 将所有的字符串统一格式为 /??/???/ 在末尾加个/保证字后一个路径名可以读出来
if(path.charAt(path.length() - 1) != '/') path += "/";
String res = "", name = "";
for (int i = 0; i < path.length(); i ++ ) {
if(path.charAt(i) != '/') name += path.charAt(i); // 一直读完一个单词
else if(name.equals(".") || name.equals("")) { // .代表当前目录,空代表/连起来了
name = ""; // 这里也要置空,应为有"."的存在
} else {
if(name.equals("..")) {
// 回退一步
int to = res.length() - 1;
// 最终to之后的字符全删掉(包括to)
while(to >= 0 && res.charAt(to) != '/') to -- ;
if(to > -1) res = res.substring(0, to);
else res = "";
} else {
// 加上这个路径
res += "/" + name;
}
name = "";
}
}
if(res.equals("")) res = "/"; // 这里要转换
return res;
}
}
代码很丑,裂开