Given an absolute path for a file (Unix-style), simplify it.
For example, path = "/home/", =>
"/home" path =
"/a/./b/../../c/", => "/c"
Corner Cases:
"/../"? In this case, you should return "/".
'/' together, such as "/home//foo/". In this
case, you should ignore redundant slashes and return
"/home/foo".
Use stack to handle /../.
RegExp matching.
/**
* @param {string} path
* @return {string}
*/
var simplifyPath = function(path) {
return '/' + (path.match(/[^\/]+/g) || [])
.reduce((stack, p) => {
if (p === '..') {
stack.pop()
} else if (p !== '.') {
stack.push(p)
}
return stack
}, [])
.join('/')
};
Direct search.
/**
* @param {string} path
* @return {string}
*/
var simplifyPath = function(path) {
const len = path.length
const stack = []
let e = 0
while (e < len) {
while (e < len && path[e] === '/') {
e++
}
const s = e
while (e < len && path[e] !== '/') {
e++
}
if (s < e) {
const p = path.slice(s, e)
if (p === '..') {
stack.pop()
} else if (p !== '.') {
stack.push(p)
}
}
}
return '/' + stack.join('/')
};