• 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".
    参考:http://blog.csdn.net/maverick1990/article/details/23275051
    题意:简化一个Unix文件路径,注意:
    (1)"/." 表示本级目录,可直接忽略
    (2)"/.." 表示返回上一级目录,即若上一级目录存在,连同"/.."一并删除,否则只删除/..
    (3)若去除冗余后路径为空,返回"/"
    (4)若包含连续"/",删除多余的
    (5)若路径不是单个“/”,删除路径最后一个“/”
    分析:一开始用逐个字符判断的方法,考虑很多边界条件。后来用字符串分割的思想,比较简明。思路如下:
    (1)用“/”分割字符串,遍历每个分割部分,存入一个vector<string>中
    (2)若当前分割部分为空,证明有连续的"/"或是最后一个“/”,忽略
    (3)若当前部分为“.”,忽略
    (4)若当前部分为“..”,若vector不为空,去除vector最后一个元素
    (5)再将vector中的string用“/”连起来,得到结果
     
    C++实现代码:
    #include<iostream>
    #include<vector>
    #include<string>
    #include<sstream>
    using namespace std;
    
    class Solution
    {
    public:
        string simplifyPath(string path)
        {
            if(path.empty())
                return "";
            vector<string> ret;
            string tmp;
            stringstream ss(path);
            while(getline(ss,tmp,'/'))
            {
                if(tmp.empty()||tmp==".")
                    continue;
                if(tmp=="..")
                {
                    if(!ret.empty())
                        ret.pop_back();
                }
                else
                    ret.push_back(tmp);
            }
            tmp.clear();
            for(int i=0; i<(int)ret.size(); i++)
            {
                tmp+="/";
                tmp+=ret[i];
            }
            if(ret.empty())
                return "/";
            return tmp;
        }
    };
    
    int main()
    {
        Solution s;
        string ss="";
        cout<<s.simplifyPath(ss)<<endl;
    }

     第二遍

    class Solution {
    public:
        string simplifyPath(string path)
        {
            if(path.empty())
                return "";
            string res="/";
            vector<string> vec;
            istringstream ss(path);
            string tmp;
            while(getline(ss,tmp,'/'))
            {
                if(tmp.empty()||tmp==".")
                    continue;
                if(tmp==".."&&!vec.empty())
                {
                    vec.pop_back();
                    continue;
                }
                else if(tmp!="..")
                    vec.push_back(tmp);
            }
            int i=0;
            while(i<vec.size())
            {
                res+=vec[i];
                ++i;
                if(i<vec.size())
                    res+='/';
            }
            return res;
        }
    };
  • 相关阅读:
    2018-2019-1 20189206 《深入理解计算机系统》第二章学习笔记
    2018-2019-1 20189206 《Linux内核原理与分析》第四周作业
    2018-2019-1 20189206 《构建之法》第二章学习笔记
    2018-2019-1 20189206 《文献管理与信息分析》学习笔记
    2018-2019-1 20189206 《Linux内核原理与分析》第三周作业
    2018-2019-1 20189206 《构建之法》第一章学习笔记
    2018-2019-1 20189206 vim.c插件安装
    2018-2019-1 20189206 《文献管理与信息分析》快速浏览
    将文件转换为base64字符串,然后还原
    读取2007以上版本的excel(xslx格式)
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4136289.html
Copyright © 2020-2023  润新知