-
Notifications
You must be signed in to change notification settings - Fork 90
/
Simplify_Path.js
64 lines (56 loc) · 1.88 KB
/
Simplify_Path.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*
Simplify Path
https://leetcode.com/problems/simplify-path/description/
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"
path = "/a/../../b/../c//.//", => "/c"
path = "/a//b////c/d//././/..", => "/a/b/c"
In a UNIX-style file system, a period ('.') refers to the current directory, so it can be ignored in a simplified path. Additionally, a double period ("..") moves up a directory, so it cancels out whatever the last directory was. For more information, look here: https://en.wikipedia.org/wiki/Path_(computing)#Unix_style
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".
*/
var simplifyPath = function (path) {
var queue = [];
var iter = path.length - 1;
while (iter >= 0) {
if (path.charAt(iter) === "/") {
iter--;
} else if (path.slice(iter - 1, iter + 1) == "/.") {
iter -= 2;
} else if (path.slice(iter - 2, iter + 1) === "/..") {
iter -= 3;
queue.unshift("/..");
} else {
// it's a characteriter
const endChars = iter;
while (iter >= 0 && path.charAt(iter) !== "/") {
iter--;
}
if (queue.length > 0 && queue[0] === "/..") {
queue.shift();
} else {
queue.push("/" + path.slice(iter + 1, endChars + 1));
}
}
}
var ret = "";
var elem;
while (queue.length > 0) {
elem = queue.shift();
if (elem == "/..") {
while (queue.length > 0 && queue.shift == "/..") {
elem += "/..";
}
elem = queue.length > 0 ? elem : "";
} else {
ret = elem + ret;
}
}
return ret.length == 0 ? "/" : ret;
};
module.exports.simplifyPath = simplifyPath;