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();
}
}