leetcode刷题笔记七十一题 简化路径

leetcode刷题笔记七十一题 简化路径

源地址:71. 简化路径

问题描述:

以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径

请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。

示例 1:

输入:"/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。
示例 2:

输入:"/../"
输出:"/"
解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。
示例 3:

输入:"/home//foo/"
输出:"/home/foo"
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
示例 4:

输入:"/a/./b/../../c/"
输出:"/c"
示例 5:

输入:"/a/../../b/../c//.//"
输出:"/c"
示例 6:

输入:"/a//b////c/d//././/.."
输出:"/a/b/c"

/**
通过使用scala String类型方法split,将字符串中的“/”作为分隔符,将其中内容转化入数组arr
由于arr(0)默认为“”,故从1 to arr.length-1进行遍历,其中数组中的内容可能为:
1."." => 跳出当前循环
2."" => 跳出当前循环
3.".." => 检查ans的长度是否大于0 是则丢弃最后一个元素 否则跳出
4.否则添加进入ans
最后, 对ans首部添加"/"即可
*/
import scala.collection.mutable
import util.control.Breaks._
object Solution {
    def simplifyPath(path: String): String = {
        val arr = path.split("/")
        val ans = mutable.ListBuffer[String]()

        for(i <- 1 to arr.length-1){
            breakable{
                arr(i) match {
                    case "." => break()
                    case ".." => {if(ans.length == 0) break() else ans.remove(ans.length-1)}
                    case "" => break()
                    case _ => ans += arr(i) 
                }

            }
        }
        val res = "/" + ans.mkString("/")
        return res
    }
}
posted @ 2020-07-18 22:30  ganshuoos  阅读(173)  评论(0编辑  收藏  举报