这是一道新知补课题,unix的文件path表示法:
当遇到“/../"则需要返回上级目录,需检查上级目录是否为空。
当遇到"/./"则表示是本级目录,无需做任何特殊操作。
当遇到"//"则表示是本级目录,无需做任何操作。
当遇到其他字符则表示是文件夹名,无需简化。
当字符串是空或者遇到”/../”,则需要返回一个"/"。
当遇见"/a//b",则需要简化为"/a/b"。
依题意,设计一个栈,做如下操作:
先将字符串依"/"分割出来,然后检查每个分割出来的字符串。
当字符串为空或者为".",不做任何操作。是并的逻辑关系好不好!!!!!
当字符串不为"..",则将字符串入栈。
当字符串为"..", 则弹栈(返回上级目录)。
path = "/home/", => "/home" path = "/a/./b/../../c/", => "/c" path = "/../", => "/" path = "/home//foo/", => "/home/foo"
public class Solution {
public String simplifyPath(String path) {
if (path == null) {
return null;
}
String[] array = path.split("/");
Stack<String> stack = new Stack<>();
for (String str: array) {
//if (!str.equals(".") || !str.equals("")) {
if (!str.equals(".") && !str.equals("")) {
if (str.equals("..")) {
if (!stack.isEmpty()) {
stack.pop();
}
} else {
stack.push(str);
}
}
}
StringBuilder sb = new StringBuilder();
while(!stack.isEmpty()) {
sb.insert(0, stack.pop());
sb.insert(0, "/");
}
return sb.length() == 0 ? "/" : sb.toString();
}
}