1. 程式人生 > >71. 簡化路徑

71. 簡化路徑

簡化路徑

給定一個文件 (Unix-style) 的完全路徑,請進行路徑簡化。
例如,
path = “/home/” => “/home”
path = “/a/./b/…/…/c/” => “/c”
path = “/a/./b/…/c/” => “/a/c”

邊界情況:

  • 你是否考慮了 路徑 = “/…/” 的情況?
    在這種情況下,你需返回 “/” 。
  • 此外,路徑中也可能包含多個斜槓 ‘/’ ,如 “/home//foo/” 。
    在這種情況下,你可忽略多餘的斜槓,返回 “/home/foo” 。

思路+程式碼+註釋:

public class SevenOne {

    public static void main(String[] args) {
        System.out.print(simplifyPath("//"));
    }

    public static String simplifyPath(String path) {
        /*
        思路:
        新增一個例子: path = "/a/./b/../c/" => "/a/c"
        根據三個例子和邊界情況可以總結出規律:
        使用集合記錄需要記錄的字串,整個路徑可以看成是用/分隔開的字串陣列,分割後的字串陣列如果字串是.那麼不記錄;
        如果是..那麼該..不記錄並且移除集合中記錄的最後一個字串;最後將集合中的字串都拼接起來
         */
        String[] pathStrs=path.split("/");
        //說明字串只有/或者//
        if (pathStrs.length==0)
        {
            return "/";
        }
        //使用集合記錄可以保留的字串
        List<String> resList=new ArrayList<>();
        for (int i = 0; i < pathStrs.length; i++) {
            //字串不是.
            if (!pathStrs[i].equals("."))
            {
                //字串不是""
                if (!pathStrs[i].equals(""))
                {
                    if (pathStrs[i].equals(".."))
                    {
                        if (resList.size()>0)
                        {
                            resList.remove(resList.size()-1);
                        }
                    }else {
                        resList.add("/"+pathStrs[i]);
                    }
                }
            }
        }
        //記錄集合中沒有字串,說明路徑中沒有字母,返回/
        if (resList.size()==0)
        {
            return "/";
        }
        StringBuilder res=new StringBuilder();
        for (String str:resList
             ) {
            res.append(str);
        }
        return res.toString();
    }
}