Problem
Given an absolute path for a file (Unix-style), simplify it.
Example
"/home/", => "/home" //去掉末尾的slash"/a/./b/../../c/", => "/c" //每个"/../"对应:删除一个上层的segment
Challenge
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"
.
Note
关于challenge的两点:
"/../"
,这里讨论的有两种情况,空集和"/../"
本身。空集加一个if语句返回slash就可以了,"/../"
本身要综合Example的例子,pop出上一层元素。Multiple slashes,可以用split()函数去掉所有slash,然后多考虑一个slash中间为空的case。
关于switch语句的一个特点:
我们对case ""和case "."其实都是不做操作,然而,两个case可以都break,但是不能都不做操作。像这样:
case "":case ".":
这样这两个case就都会等价于下一个case:case ".."
. 就会出错。
Solution
public class Solution { public String simplifyPath(String path) { Stackstack = new Stack (); String[] segments = path.split("/"); for (String segment: segments) { switch(segment) { case "": break; case ".": case "..": if (!stack.isEmpty()) { stack.pop(); } break; default: stack.push(segment); } } StringBuilder sb = new StringBuilder(); if (stack.isEmpty()) {//空集的情况 return "/"; } while (!stack.isEmpty()) { sb.insert(0, "/"+stack.pop());//Don't miss the slash! } return sb.toString(); }}