这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战
题目
给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
始终以斜杠 '/' 开头。
两个目录名之间必须只有一个斜杠 '/' 。
最后一个目录名(如果存在)不能 以 '/' 结尾。
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '..')。
返回简化后得到的 规范路径 。
示例
输入: path = "/home/"
输出: "/home"
解释: 注意,最后一个目录名后面没有斜杠。
输入: path = "/../"
输出: "/"
解释: 从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。
输入: path = "/home//foo/"
输出: "/home/foo"
解释: 在规范路径中,多个连续斜杠需要用一个斜杠替换。
输入: path = "/a/./b/../../c/"
输出: "/c"
提示
1 <= path.length <= 3000path由英文字母,数字,'.','/'或'_'组成。path是一个有效的 Unix 风格绝对路径。
解题思路
由题目我们可以得出字符串path中,有几个字符有对应的动作:
.表示当前目录本身..表示需要切换至上一级目录//需要视为/
由于路径是通过/符号来表示目录,因此我们可以现将字符集进行分割,将多级目录分隔开。再用栈来实现入队出队的操作,正常字符则入队,遇到空字符串或者.则不进行任何操作,遇到..则将前一目录弹出。
代码实现
class Solution {
public String simplifyPath(String path) {
// 分隔多级目录
String[] paths = path.split("/");
LinkedList<String> list = new LinkedList<>();
// 遍历所有的目录
for(String p : paths){
// 不做任何操作
if(".".equals(p) || "".equals(p)){
continue;
}
// 当遇到 .. 则弹出上一级目录
if(!list.isEmpty() && "..".equals(p)){
list.removeLast();
}else if(!"..".equals(p)){
// 正常目录,入栈
list.add(p);
}
}
// 拼接字符串,得到最终的目录
StringBuilder sb = new StringBuilder("/");
for(int i = 0; i < list.size(); ++i){
sb.append(list.get(i));
if(i < list.size() - 1){
sb.append("/");
}
}
return sb.toString();
}
}