问题描写叙述:
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
- 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"
.
基本思想:
此题能够用一个堆栈存储每层目录或文件。假设两个/之间的内容是".."就弹出栈顶元素。假设遇到“.”或“”就不变。基本思想就是这样。
但要考虑一些corner case。如“/../”,"///"等
代码:
public String simplifyPath(String path) { //Java // return "/"; path = path.trim(); if(path.equals("/")) return "/"; List<String> stack = new LinkedList<String>(); int top = -1; String tmp = path; while(!tmp.equals("")){ if(tmp.startsWith("/")) tmp = tmp.substring(1); if(tmp.equals("")) break; if(tmp.contains("/")){ int pos = tmp.indexOf("/"); String file = tmp.substring(0,pos); tmp = tmp.substring(pos); if(file.equals(".")|| file.equals("")) continue; if(file.equals("..")){ if(top>-1) top--; continue; } stack.add(++top,file); } else { String file = tmp; tmp = ""; if(file.equals(".")) continue; if(file.equals("..")){ if(top>-1) top--; continue; } stack.add(++top,file); } } //generate path; String rpath = "/"; for(int i = 0; i <=top ; i++) rpath += stack.get(i)+"/"; if(top >=0) rpath = rpath.substring(0,rpath.length()-1); return rpath; }