【题目】
Given an absolute path for a file(Unix-style), simplify it.
For example,
path = "/home/", =>"/home"
path = "/a/./b/../../c/", =>"/c"
简化Unix上的绝对路径,也就是多个'/'代表一个,'..'表示返回上一级目录,‘.'代表当前目录。
【思路】
path = "/a/./b/../../c/", =>"/c"
整个过程:
l “/”根目录
l “a”进入子目录a,目前处于“/a”
l “.”当前目录,不操作仍处于“/a”
l “/b”进入子目录b,目前处于“/a/b”
l “..”返回上级目录,处于“/a”
l “..”返回上级目录,处于根目录“/”
l “c”进入子目录c,目前处于“/c”
利用栈解决问题:
把非'/'和'.'push进栈,如果遇到'..'出栈pop,否则压栈push。最后还原成路径格式。
【Python实现】
方法一:利用栈
# -*- coding: utf-8 -*-
"""
Created on Sat Aug 5 13:32:23 2017
@author: Administrator
"""
class Solution(object):
def simplifyPath(self, path):
"""
:type path: str
:rtype: str
"""
stack = []
i = 0
res = ''
path_len = len(path)
while i < path_len:
j = i+1
while j < path_len and path[j] !="/":
j += 1
subpath = path[i+1:j]
if len(subpath) > 0:
if subpath == "..":
if stack != []:
stack.pop()
elif subpath != ".":
stack.append(subpath)
i = j
if stack == []:
return "/"
for character in stack:
res += "/"+ character
print(res)
return res
S = Solution()
S.simplifyPath("/a/./b/../../c/")
方法二:利用python的split()函数
class Solution:
#@param path, a string
#@return a string
def simplifyPath(self, path):
path = path.split('/')#将/作为划分标志,转化为list ['', 'a', '.', 'b','..', '..', 'c', '']
curr = '/'
for character in path:
if character == '..':
if curr != '/':
curr ='/'.join(curr.split('/')[:-1])
if curr == '': curr = '/'
elif character != '.' andcharacter != '':
if curr != '/':
curr += '/' + character
else:
curr += character
print(curr)
return curr
S = Solution()
S.simplifyPath("/a/./b/../../c/")