题目
给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/‘ 开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,’//‘)都被视为单个斜杠 ‘/‘ 。 对于此问题,任何其他格式的点(例如,’…’)均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
- 始终以斜杠 ‘/‘ 开头。
- 两个目录名之间必须只有一个斜杠 ‘/‘ 。
- 最后一个目录名(如果存在)不能 以 ‘/‘ 结尾。
- 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 ‘.’ 或 ‘..’)。
示例
输入:path = “/home/“
输出:“/home”
解释:注意,最后一个目录名后面没有斜杠。
输入:path = “/../“
输出:“/“
解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。
输入:path = “/home//foo/“
输出:“/home/foo”
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
输入:path = “/a/./b/../../c/“
输出:“/c”
解题思路
- 将字符串按照”/“分割,保存到字符串数组中;
- 然后判断数组中元素,如果是”..”,如果栈非空,则出栈;如果是”.”或者是””,则不管;如果是其他元素,则进栈;
- 用String.join()按进栈顺序拼接成字符串。
代码
import java.util.Stack;public class Simplify_Path_71 {public String simplifyPath(String path) {Stack<String> sk = new Stack<String>();String s= "";String[] a = path.split("/");for (int i=0;i<a.length;i++){if (a[i].equals("..")){if (!sk.empty()){sk.pop();}}else if(a[i].equals(".") || a[i].equals("")){continue;}else{sk.push(a[i]);}}//栈内元素按顺序拼接可以用String.join("/",sk);s = "/" + String.join("/",sk);return s;}}
