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"
. - 解决这道题的思路主要是将字符串使用java的split("/")函数分开,然后分别对字符串
- "..",".","/"分别处理就行了
- 代码1:
public class Solution { public String simplifyPath(String path) { Stack stack = new Stack(); String[] str = path.split("/"); for(String temp : str){ // if(temp.equals("..") ) // { // if(!stack.isEmpty()) // stack.pop(); // } // else if(!temp.equals(".") && !temp.equals("")) // stack.push(temp); //修改一下用swich看下耗时 switch(temp){ case "": case ".": break; case "..": if(!stack.isEmpty()) { stack.pop(); } break; default : stack.push(temp); } } StringBuilder Str = new StringBuilder(); if(stack.isEmpty()) Str.insert(0, "/"); while(!stack.isEmpty()) { Str.insert(0, "/"+stack.pop()); } return Str.toString(); } }
- 如果换成对字符串操作的话
- 代码2:
public class Solution { public String simplifyPath(String path) { Stack stack = new Stack(); String[] str = path.split("/"); for(String temp : str){ if(temp.equals("..") ) { if(!stack.isEmpty()) stack.pop(); } else if(!temp.equals(".") && !temp.equals("")) stack.push(temp); } StringBuilder Str = new StringBuilder(); if(stack.isEmpty()) Str.insert(0, "/"); while(!stack.isEmpty()) { Str.insert(0, "/"+stack.pop()); } return Str.toString(); } }
性能有8%左右的提升!