[抄题]:
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
[暴力解法]:
时间分析:
空间分析:
[优化后]:
时间分析:
空间分析:
[奇葩输出条件]:
[奇葩corner case]:
空格属于不需要输出的特例,所以先存到hashset中
deque中啥也没有,就输出/
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"
.
[思维问题]:
[一句话思路]:
用push pop从一端把该存的存入,用for循环从另一端输出
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
- hashset<>(),括号中表示要构造的内容,把array函数放进去
Arrays.asList("..",".","")
[二刷]:
- deque非空才能POP
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
[总结]:
用push pop从一端把该存的存入,用for循环从另一端输出
[复杂度]:Time complexity: O(n) Space complexity: O(n)
[英文数据结构或算法,为什么不用别的数据结构或算法]:
从左往右走:
"/b/c/" - directory 'b ' - > directory 'c ' "." - current directory "./" - current directory "../" - one directory up e.g "/" : root directory "b/c/../" : it will go from c to b "c/b/./" : it is still in directory b
[算法思想:递归/分治/贪心]:
[关键模板化代码]:
[其他解法]:
[Follow Up]:
[LC给出的题目变变变]:
[代码风格] :
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Solution { public String simplifyPath(String path) { //cc //ini: deque, set,put into deque Deque<String> deque = new LinkedList<>(); Set<String> set = new HashSet<>(Arrays.asList("",".","..")); for (String w : path.split("/")) { if (w.equals("..") && !deque.isEmpty()) deque.pop(); else if (!set.contains(w)) deque.push(w); } //get from deque, res String res = ""; for (String words : deque) res = "/" + words + res; return res.isEmpty() ? "/" : res; } }