71. 簡化路徑
阿新 • • 發佈:2019-01-02
簡化路徑
給定一個文件 (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(); } }