加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱资讯网 (https://www.52junxun.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

Leetcode做题日记:71. 简化路径(PYTHON)

发布时间:2022-12-05 11:18:34 所属栏目:Unix 来源:
导读:  以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说unix路径简化,将其转换为规范路径。

  在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录
  以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说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//bc/d//././/…"
 
  输出:"/a/b/c"
 
  第一次的代码:
 
  思路首先是去除path最后的斜杠,然后从0遍历一遍,遇到正紧目录就加入到minpath中,遇到斜杠就把minpath加入到栈pathpist中,遇到一个点,继续遍历,遇到两个点,出栈即可
 
   while path and path[-1]=='/' :
              path=path[:-1]
          if not path :
              return '/'
          i=0
          pathlist=[]
          minpath=''
          while i<len(path):
              if path[i]=='/':
                  i=i+1
                  if minpath:
                      pathlist.append(minpath)
                      minpath=''
                  continue
              elif path[i]=='.':
                  if i<len(path)-1:
                      if path[i+1]=='.' and len(pathlist)>0:
                          pathlist.pop()
                          i=i+1
                  else:
 
                      break
              else:
                  minpath=minpath+path[i]
              i=i+1
          if minpath:
              pathlist.append(minpath)
          ans='/'
          i=0
          while i<len(pathlist):
              ans=ans+pathlist[i]+'/'
              i=i+1
              if i==len(pathlist):
                  ans=ans[:-1]
          return ans
  但是没想到,测试来了一个:"/…",我的代码只能检测一个或者两个点,一次来三个点是啥意思。。。。
 
  第二次代码:
 
  这次不在遍历中处理栈,先遍历取出两个斜杠之间的字符存入列表pathlist中,在这个列表中,若有两个点,则非空栈mpathlist出栈,否则入栈
 
   path=path+'/' #加一个斜杠无伤大雅,避免最后一个minpath因循环结束
          i=0        #而无法添加到列表pathlist
          pathlist=[]
          minpath=''
          while i<len(path):
              if path[i]=='/': #遇到/则继续遍历
                  i=i+1
                  if minpath: #若斜杠前有文件名,则加入列表
                      pathlist.append(minpath)
                      minpath='' #重置文件名
                  continue
              else: #文件名加入字符栓minpath
                  minpath=minpath+path[i]
              i=i+1
          
          j=0
          mpathlist=[] #栈
          while j<len(pathlist):
              if pathlist[j]=='..' :
                  if mpathlist: #非空时出栈
                      mpathlist.pop()   
              elif pathlist[j]=='.': #这个继续遍历
                  j=j+1
                  continue
              else: #非以上两种情况入栈
                  mpathlist.append(pathlist[j])
              j=j+1    
          
          ans='/'
 
          i=0
          while i<len(mpathlist):
              ans=ans+mpathlist[i]+'/'
              i=i+1
              if i==len(mpathlist): #最有一个文件名时,删除最后的斜杠
                  ans=ans[:-1]
          return ans
  48ms,排名18%
 
  第三次代码:
 
  第一行语句就能替代我第二次代码前半部分,生成pathlist的代码,服气
 
  解释一下:a=‘a/c/r/…/’,a.split(’/’)=[‘a’, ‘c’, ‘r’, ‘. .’, ‘’],将这个列表每一个非空项加入到pathlist中
 
   pathlist = [i for i in path.split('/') if i]
          
          j=0
          mpathlist=[] #栈
          while j<len(pathlist):
              if pathlist[j]=='..' :
                  if mpathlist: #非空时出栈
                      mpathlist.pop()   
              elif pathlist[j]=='.': #这个继续遍历
                  j=j+1
                  continue
              else: #非以上两种情况入栈
                  mpathlist.append(pathlist[j])
              j=j+1    
            
          
          ans='/'
          i=0
          while i<len(mpathlist):
              ans=ans+mpathlist[i]+'/'
              i=i+1
              if i==len(mpathlist):
                  ans=ans[:-1]
          return ans
          '''
          当然,这个ans也可以这么写:
          ans=''
          if not mpathlist:
              return '/'
          i=0
          while i
  36ms,排名47%
 

(编辑:我爱资讯网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章