题目链接:
题目大意:
简化路径,如果对于‘.‘字符,表明为此目录,对于‘..‘字符,表明为回到此目录上一节点(即:删除上一节点),我们现在需要删除多余的‘/‘字符和‘.‘字符
做题报告:
(1)该题涉及的算法与数据结构与知识点
Java NIO中的Files类,正则表达式,栈
(2)自己的解答思路+代码+分析时间和空间复杂度
栈
class Solution { public String simplifyPath(String path) { String[] strs = path.split("/+"); Stack<String> stack = new Stack<String>(); for(int i = 1;i < strs.length ;i++){ if(strs[i].equals(".")) continue; else if(strs[i].equals("..")){ if(stack.empty() == false) stack.pop(); } else stack.push("/"+strs[i]); } if(stack.empty() == true) return "/"; StringBuilder ans = new StringBuilder(); while(stack.empty() == false){ String e = stack.pop(); ans.insert(0,e); } return ans.toString(); } }
时间复杂度:O(N)
空间复杂度:O(N)
(3)大神们的解答思路+代码+分析时间和空间复杂度
第一种:IO流
import java.nio.file.*; class Solution { public String simplifyPath(String path) { return Paths.get(path).normalize().toString(); } }
第二种:正则表达式
思路:先使用split()分割字符串,清除‘/‘,‘//‘,‘///’等等斜杠字符。
然后处理‘.‘与‘..‘字符,对于‘.‘字符串,不记入答案,对于‘..‘字符串,如果答案前面有字符串,删除前面一个字符串,对于其他字符串,则加入答案。
class Solution { public String simplifyPath(String path) { String[] strs=path.split("/+"); ArrayList<String> ans=new ArrayList<>(); for(int i=1;i<strs.length;i++) { if(strs[i].equals(".")) continue; else if(strs[i].equals("..")) { if(!ans.isEmpty()) ans.remove(ans.size()-1); } else ans.add("/"+strs[i]); } if(ans.isEmpty()) return "/"; String res=""; for(String e:ans) res+=e; return res; } }
时间和空间复杂度:
时间复杂度:O(N)
空间复杂度:O(N)
第三种:栈
(4)比较自己想的和参考答案的区别
感受:参考答案更多元化