1. 程式人生 > >LeetCode筆記——71簡化路徑

LeetCode筆記——71簡化路徑

題目:

給定一個文件 (Unix-style) 的完全路徑,請進行路徑簡化。

例如,path = "/home/", => "/home"path = "/a/./b/../../c/", => "/c"

邊界情況:

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

思路:這個題的題目有點不太懂。在網上參考了大神的程式碼,先把程式碼弄清楚。原文地址:https://blog.csdn.net/fightforyourdream/article/details/16917563

基本的思路是首先把字串用/分割為字元陣列;然後依次對字元進行判斷將符合條件的放入棧或者佇列中;最後轉化為字元輸出。在以下兩種程式碼中,使用了集合linkedlist.該集合中包含了棧和佇列的方法,也就是說可以當成棧和佇列使用。其中棧的操作為pop(),push(),操作在連結串列頭部進行;佇列的操作為add(),remove(),進佇列從尾部進,在頭部出佇列。以下兩種程式碼分別是棧和佇列的實現。

程式碼:

public class Solution {     public String simplifyPath(String path) {         String[] ss = path.split("/");  //使用/將字串分解為字元陣列。新的字元陣列中不在包括/         LinkedList<String> ll = new LinkedList<String>();         for(int i=0; i<ss.length; i++) {             if(!ll.isEmpty() && ss[i].equals("..")) {                 ll.removeLast();   //刪除".."前新增的字元             } else if(ss[i].length() != 0 && !ss[i].equals(".") && !ss[i].equals("..")){                 ll.add(ss[i]);    //將滿足條件的字元加入到佇列中             }         }                  if(ll.isEmpty()) {             return "/";         }                  //String s = "";         StringBuilder s=new StringBuilder("");  //使用StringBuilder來完成迴圈加入字元         while( !ll.isEmpty() ) {            // s += "/";             s.append('/');  //append()新增字元             //s += ll.remove();             s.append(ll.remove());         }         return s.toString();   //將結果轉化為字元返回     } }

public static String simplifyPath(String path) {         if(path.length() == 0){             return path;         }                  String[] splits = path.split("/");         LinkedList<String> stack = new LinkedList<String>();         for (String s : splits) {             if(s.length()==0 || s.equals(".")){                 continue;             }else if(s.equals("..")){                 if(!stack.isEmpty()){                     stack.pop();                 }             }else{                 stack.push(s);             }         }                  if(stack.isEmpty()){             stack.push("");         }         String ret = "";         while(!stack.isEmpty()){             ret += "/" + stack.removeLast();         }                  return ret;     } 執行最快的程式碼:

這段程式碼的思路是使用兩個指標依次取出字串中兩個//之間的字元;然後進行判斷,滿足條件的新增到ArrayList中;然後再給結果新增/輸出,這一步也是使用的StringBuilder.

class Solution {
    public String simplifyPath(String path) {
        List<String> dirs = new ArrayList<>();
        
        int dirStart = 0, len = path.length();
        while (dirStart < len) {
            // consume one slash and the string
            // find the index of directory
            while (dirStart < len && path.charAt(dirStart) == '/') dirStart++;
            
            int dirEnd = dirStart;
            while (dirEnd < len && path.charAt(dirEnd) != '/') dirEnd++;
            
            String dir = path.substring(dirStart, dirEnd);
            if (dir.equals(".")) {
            }
            else if (dir.equals("..")) {
                if (! dirs.isEmpty()){
                    dirs.remove(dirs.size() - 1);
                }
            } else {
                if (dir.length() > 0) {
                    dirs.add(dir);
                }
            }
            dirEnd++;
            dirStart = dirEnd;
        }
        
        // combine all dirs
        StringBuilder sb = new StringBuilder("/");
        for (int i = 0; i < dirs.size(); i++) {
            if (i == dirs.size() - 1) {
                sb.append(dirs.get(i));
            } else {
                sb.append(dirs.get(i)).append("/");
            }
        }
        
        return sb.toString();
    }
}