71. Simplify Path

来源:互联网 发布:酷比魔方windows系统 编辑:程序博客网 时间:2024/06/12 00:59

Given an absolute path for a file (Unix-style), simplify it.

For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"

click to show corner cases.

Corner Cases:

  • Did you consider the case where path = "/../"?
    In this case, you should return "/".
  • Another corner case is the path might contain multiple slashes '/' together, such as "/home//foo/".
    In this case, you should ignore redundant slashes and return "/home/foo".
題意:

簡化路徑(Unix路徑表示),例如:

path = "/home/", => "/home"

path = "/a/./b/../../c/", => "/c"

題解:

將path以"/"來切割文件夾名稱,並歷遍所有文件夾名稱,在歷遍過程中,利用stack紀錄路徑,有下面幾種情況:

  1. 遇到".",略過這個文件夾名稱
  2. 遇到"..",將stack排出一個文件夾名稱
  3. 遇到其他字符串則將該字符串加入stack當中
然後再將stack全部排出,用以組成簡化過的路徑名稱。
*注意coner case*
package LeetCode.Medium;import java.util.Stack;public class SimplifyPath {    public String simplifyPath(String path) {        if(path == null || path.length() == 0) {            return "/";        }                //將路徑以"/"的方式進行切割,切出每個文件夾的名稱        String[] names = path.split("/");        Stack<String> stack = new Stack<>();                //歷遍所有文件夾的名稱        for(int i = 0; i < names.length; i ++) {            //若遇到"."則可以略過(相同文件夾)            if(names[i].equals(".") == true || names[i].equals("")) {                continue;            }                        //若遇到".."則可以推出一個文件夾(上一個文件夾)            if(names[i].equals("..") == true) {                //需要避免stack為空的情況                if(stack.isEmpty() == false) {                    stack.pop();                }            //其他情況則可以添加文件夾            } else {                stack.push(names[i]);            }        }                //若stack為空,可以直接輸出結果        if(stack.isEmpty() == true) {            return "/";        }                //開始進行結果的拼接        String result = "";        int i = 0;        while(stack.isEmpty() == false) {            String folder_name = stack.pop();            //首個文件夾前面不加"/",到最後才添加,避免混亂            if(i == 0) {                result = folder_name;            } else {                result = folder_name + "/" +result;            }            i ++;        }                //在首個文件夾名稱前面添加"/"        result = "/" + result;                return result;    }}

原创粉丝点击