zoukankan      html  css  js  c++  java
  • [Leetcode] Simplify path 简化路径

    Given an absolute path for a file (Unix-style), simplify it.

    For example,
    path ="/home/", =>"/home"
    path ="/a/./b/../../c/", =>"/c"

    click to show corner cases.

    Corner Cases:
    • 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".
     题意:简化路径,这题的解决方法是弄懂题意。给题加上两个例子,path = "/a/./b/../c/", => "/a/c"和path = "/a/./b/c/", => "/a/b/c"。规律如下:
    1)两个' / '之间为 ' . ',表示本级目录,直接去掉;
    2)两个' / '之间为 ' .. ',表示返回上一级目录,即,".."时删掉它上面挨着的一个路径,但之前要检查上一级是否为空;
    3)如果为空,则返回 ' / ';
    4)遇到' // ',即两个连在一起,就返回一个' / ';
    思路:从上面的规律可知,如何简化路径主要在于两个 ' / '之间的字符是什么,所以,采取的方法是:将路径看做是由一个或多个"/"分割开的多个子字符串,分别对其处理即可。
    采用stack,每找到一个dir, 如果不是"."或者"..",就压入stack,如果是"..",就从stack弹出一个,最后把stack里的dir组合成一个string。但stack结构不方便组成一个string,所以这里使用向量,代码如下:
     1 class Solution {
     2 public:
     3     string simplifyPath(string path) 
     4     {
     5         vector<string> res;
     6 
     7         for(int i=0;i<path.size();)
     8         {
     9             i++;
    10             if(i==path.size())    break;  //注意i++后会越界
    11             int flag=i;
    12             while(path[i] !='/'&&i<path.size())   //注意i++后会越界
    13                 i++;
    14             
    15             string dir=path.substr(flag,i-flag);  //substr()的参数为起点和个数
    16 
    17             if( !dir.empty()&&dir !=".")
    18             {
    19                 if(dir=="..")
    20                 {
    21                     if( !res.empty())
    22                         res.pop_back();
    23                 }
    24                 else
    25                     res.push_back(dir);
    26             }
    27             
    28         } 
    29 
    30         if(res.empty())
    31             return "/";
    32 
    33         string result;
    34         for(int i=0;i<res.size();++i)
    35         {
    36             result+='/'+res[i];
    37         }   
    38         
    39         return result; 
    40     }
    41 };

     还有一种同样的思路但是采用迭代器的,见连接1

  • 相关阅读:
    MySQL的排序方式
    Hibernate中查询优化策略
    kafka实现SASL_PLAINTEXT权限认证·集成springboot篇
    kafka实现SASL_PLAINTEXT权限认证·服务器篇
    SpringMvc服务端实现跨域请求解决方案
    maven打包日志输出优化-去掉泛型与过时的警告
    SpringMVC之控制器的单例和多例管理
    springmvc中的controller是单例的
    com.caucho.hessian.io.HessianProtocolException: is unknown code 解决方案
    浅谈大型web系统架构
  • 原文地址:https://www.cnblogs.com/love-yh/p/7082113.html
Copyright © 2011-2022 走看看