zoukankan      html  css  js  c++  java
  • 14简化路径(71)

    14 简化路径

    作者: Turbo时间限制: 1S章节: DS:栈

    晚于: 2020-07-15 12:00:00后提交分数乘系数50%

    截止日期: 2020-07-22 12:00:00

    问题描述 :

    以 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"

    可参考以下main函数:

    输入说明 :

    输入一行,表示一个Unix风格的文件绝对路径

    输出说明 :

    输出一行,表示规范路径

    输入范例 :

    /a/./b/../../c/

    输出范例;

    /c
    输入:"/a/./b/../../c/"
    输出:"/c"
    
    1. 遇到 /a,当前路径从 / 变成 /a
    2. 遇到 . 说明是当前目录 /a 不变
    3. 遇到 b,变成 /a/b
    4. 遇到 ..,切换到上级目录,当前目录为/a/b,上级目录就是/a
    5. 同4,变成根目录 /
    6. 遇到 c,变成 /c
      #include <iostream>
      #include <stack>
      #include <string>
      using namespace std;
      class Solution {
      public:
          string simplifyPath(string path) 
          {
              path += "/";
              stack<string>  st;
      
              string str="";
              for(int i=0;i<path.length();i++)
              {
                  if(path[i]=='/')
                  {
                      if(str==".."&&!st.empty())
                          st.pop();
                      else if(str!=".."&&str!="."&&str!="")
                          st.push(str);
                      str="";
                  }
                  else
                      str=str+path[i];
              }
      
      
              string res="";
              while(!st.empty())
              {
                  string temp=st.top();
                  st.pop();
                  res="/"+temp+res;
              }
              if(res.length()==0)//不加这句,oj会报错,考虑/../或者/的情况
                  res="/";
              return res;
          }
      };
      int main()
      {
          string str;
          cin>>str;
          string path=Solution().simplifyPath(str);
          cout<<path<<endl;
          return 0;
      }
  • 相关阅读:
    shell脚本
    正则表达式和文本处理工具二
    正则表达式和文本处理工具
    Linux基础实操六
    Linux基础实操五
    caffe 试运行MNIST
    转 Windows+VS2013爆详细Caffe编译安装教程
    python一
    VS2008 C++ 调用MATLAB 2009b 生成的DLL .
    MFC抓网页
  • 原文地址:https://www.cnblogs.com/zmmm/p/13618969.html
Copyright © 2011-2022 走看看