题目

给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/‘ 开头),请你将其转化为更加简洁的规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,’//‘)都被视为单个斜杠 ‘/‘ 。 对于此问题,任何其他格式的点(例如,’…’)均被视为文件/目录名称。

请注意,返回的 规范路径 必须遵循下述格式:

  • 始终以斜杠 ‘/‘ 开头。
  • 两个目录名之间必须只有一个斜杠 ‘/‘ 。
  • 最后一个目录名(如果存在)不能 以 ‘/‘ 结尾。
  • 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 ‘.’ 或 ‘..’)。

返回简化后得到的 规范路径 。

示例

输入:path = “/home/“
输出:“/home”
解释:注意,最后一个目录名后面没有斜杠。

输入:path = “/../“
输出:“/“
解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。

输入:path = “/home//foo/“
输出:“/home/foo”
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。

输入:path = “/a/./b/../../c/“
输出:“/c”

解题思路

  • 将字符串按照”/“分割,保存到字符串数组中;
  • 然后判断数组中元素,如果是”..”,如果栈非空,则出栈;如果是”.”或者是””,则不管;如果是其他元素,则进栈;
  • String.join()按进栈顺序拼接成字符串。

代码

  1. import java.util.Stack;
  2. public class Simplify_Path_71 {
  3. public String simplifyPath(String path) {
  4. Stack<String> sk = new Stack<String>();
  5. String s= "";
  6. String[] a = path.split("/");
  7. for (int i=0;i<a.length;i++){
  8. if (a[i].equals("..")){
  9. if (!sk.empty()){
  10. sk.pop();
  11. }
  12. }else if(a[i].equals(".") || a[i].equals("")){
  13. continue;
  14. }else{
  15. sk.push(a[i]);
  16. }
  17. }
  18. //栈内元素按顺序拼接可以用String.join("/",sk);
  19. s = "/" + String.join("/",sk);
  20. return s;
  21. }
  22. }