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

    如果仅仅从不断replace输入路径的角度出发,会非常复杂。

    如果用一个栈来一次存储各级路径的directory名字,然后重组,会简便一些,这也是文件路径简化类题目的常用思路。

    为了末尾可以顺序遍历栈重组path,我们不用传统的stack lib,而用vector来实现栈,这样可以方便顺序遍历。

    代码:

    class Solution {
    public:
        string simplifyPath(string path) {
            if(path.length() == 0) return "";
            vector<string> v;
            int p = 0, start = 0;
            while(p < path.length()){
                if(path[p] == '/') ++p;
                else{
                    start = p;
                    while(p < path.length() && path[p] != '/') ++p;
                    string temp = path.substr(start, p-start);
                    if(temp == ".."){ 
                        if(!v.empty()) v.pop_back(); //遇到".."就出栈
                        else{
                            if(path[0] != '/') v.push_back(temp); //如果没东西可以出,就要看path是否以根目录开头了,不是以根目录开头的话,".."要进栈的
                        }
                    }else if(temp == "."){} //遇到"."就跳过
                    else if(temp.length() > 0){
                        v.push_back(temp);
                    }
                }
            }
            string res = (path[0] == '/' ? "/" : ""); //重组path
            for(vector<string>::iterator i = v.begin(); i < v.end(); ++i){
                res.append(*i);
                if(i < v.end()-1) res.append("/");
            }
            return res;
        }
    };
  • 相关阅读:
    [转]为Ubuntu Server安装gnome图形桌面环境
    [转]ubuntu 安装五笔输入法
    [转]更改文件所有者
    QT 透明设置
    ubuntu 交叉编译arm linux 内核
    Opencv vs 2005编译
    [转]在skyeye中运行uboot
    object的引用 与 foreach的使用
    音频和视频
    HTML5 Canvas API
  • 原文地址:https://www.cnblogs.com/felixfang/p/3682058.html
Copyright © 2011-2022 走看看