题目:(Stack, String)
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
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"
.
题解:
主要是对路径简化定义的了解:
引用http://www.cnblogs.com/springfor/p/3869666.html
这是一道简化路径的题,路径简化的依据是:
当遇到“/../"则需要返回上级目录,需检查上级目录是否为空。
当遇到"/./"则表示是本级目录,无需做任何特殊操作。
当遇到"//"则表示是本级目录,无需做任何操作。
当遇到其他字符则表示是文件夹名,无需简化。
当字符串是空或者遇到”/../”,则需要返回一个"/"。
当遇见"/a//b",则需要简化为"/a/b"。
根据这些要求,我需要两个栈来解决问题。
先将字符串依"/"分割出来,然后检查每个分割出来的字符串。
当字符串为空或者为".",不做任何操作。
当字符串不为"..",则将字符串入栈。
当字符串为"..", 则弹栈(返回上级目录)。
参考别人的答案:
public class Solution { public String simplifyPath(String path) { if(path==null||path.length()==0) return path; Stack<String> stack = new Stack<String>(); String [] s = path.split("/"); for (int i=0; i<s.length; i++) { if(s[i].length()==0||s[i].equals(".")) continue; else if(!s[i].equals("..")) stack.push(s[i]); else { if(!stack.isEmpty()) stack.pop(); } } Stack<String> temp = new Stack<String>(); while(!stack.isEmpty()) temp.push(stack.pop()); StringBuffer result = new StringBuffer(); while(!temp.isEmpty()) result.append("/"+temp.pop()); if(result.length()==0) result.append("/"); return result.toString(); } }