列表

详情


NC299. 简化目录路径

描述

给定一个目录路径的字符串path,path由英文字母,数字,".","/" 或 "_"组成,表示指向某一个文件或者目录的绝对路径,但是有的路径会有复杂的表达,比如"/../"其实还是代表的根目录路径"/"请你将这个绝对路径转化为一个更加简洁的规范路径,转化规则如下:
1.将1个点"."表示当前目录本身,即"/a/b/./"=>表示的还是"/a/b"
2.将2个点".."表示将目前切换到上一级,即"/a/b/../"其实表示的是"/a"
3.其他数目的点或者点加上其他字符视为一个普通目录路径,比如"/.../a.."表示的是根目下有一个名字为"..."的目录文件,"..."的文件下面还有一个名字为"a.."的文件
4.任意多个连续的斜杠都被视为单个斜杠,即 "///"和"//"都被视为"/"

你返回的简化规范路径应该如下:
5.始终以斜杠 '/' 开头
6.两个目录名之间必须只有一个斜杠 '/'
7.最后一个目录名不能 '/' 结尾,根目录除外,根目录只有一个"/"
8.路径仅包含从根目录到目标文件或目录的路径上的目录,即除了"."和".."的东西应该简化,其余的普通字符应该保留下来,视为目录路径


数据范围:

示例1

输入:

"/home/web/"

输出:

"/home/web"

示例2

输入:

"/home////web//"

输出:

"/home/web"

说明:

在简化规范路径中,多个连续的"/"替换为"/",

示例3

输入:

"/../"

输出:

"/"

说明:

"/"是根目录,是顶级目录,它的上级目录还是自己

示例4

输入:

"/home/web/./tang/../miao/"

输出:

"/home/web/miao"

说明:

"/home/web/./"表示的是"/home/web",因为"."表示当前目录,但是"/home/web/./tang/../"表示的还是"/home/web",因为".."表示父目录,"/home/web/tang"的父目录就是"/home/web"

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 7ms, 内存消耗: 1036KB, 提交时间: 2022-07-26

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param path string字符串
     * @return string字符串
     */
    string simplifyPath(string path) {
        // write code here
        string a, b;
        if (path.back() != '/')
            path += '/';
        for (auto c : path) {
            if (c != '/') b += c;
            else {
                if (b == "..") {
                    while (a.size() && a.back() != '/') a.pop_back();
                    if (a.size()) a.pop_back();
                } else if (b != "." && b != "") {
                    a += "/" + b;
                }
                b.clear();
            }
        }
        if (a.empty()) a = "/";
        return a;
    }
};

C 解法, 执行用时: 7ms, 内存消耗: 1044KB, 提交时间: 2022-06-25

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param path string字符串 
 * @return string字符串
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */

char* simplifyPath(char* path ) {
    int stackStart[100001], stackEnd[100001], sTop = 0;
    int pLen = strlen(path);
    char tmp[100001] = "";
    int tmpIndex = 0;
    for (int i = 1; i < pLen; i++) {
        tmpIndex = 0;
        int j = i;
        for (; j < pLen; j++) {
            if (path[j] != '/') {
                tmp[tmpIndex++] = path[j];
            } else {
                break;
            }
        }
        if (tmpIndex != 0) {
            tmp[tmpIndex] = '\0';
            if (strcmp(tmp, "..") == 0) {
                if (sTop > 0) {
                    sTop--;
                }
            } else if (strcmp(tmp, ".") == 0) {
                // do nothing
            } else {
                stackStart[sTop] = i;
                stackEnd[sTop] = j - 1;
                sTop++;
            }
        }
        
        i = j;
    }
    
    tmpIndex = 0;
    int start, end;
    for (int i = 0; i < sTop; i++) {
        tmp[tmpIndex++] = '/';
        
        start = stackStart[i];
        end = stackEnd[i];
        for (int j = start; j <= end; j++) {
            tmp[tmpIndex++] = path[j];
        }
    }
    if (tmpIndex == 0) {
        tmp[tmpIndex++] = '/';
    }
    tmp[tmpIndex] = '\0';
    
    char *result = (char *)malloc(sizeof(char) * (tmpIndex + 1));
    strcpy(result, tmp);
    
    return result;
}




C++ 解法, 执行用时: 8ms, 内存消耗: 1036KB, 提交时间: 2022-08-04

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param path string字符串 
     * @return string字符串
     */
    string simplifyPath(string path) {
        // write code here
        string a, b;
        if (path.back() != '/')
            path += '/';
        for (auto c : path) {
            if (c != '/') b += c;
            else {
                if (b == "..") {
                    while (a.size() && a.back() != '/') a.pop_back();
                    if (a.size()) a.pop_back();
                } else if (b != "." && b != "") {
                    a += "/" + b;
                }
                b.clear();
            }
        }
        if (a.empty()) a = "/";
        return a;
    }
};

C++ 解法, 执行用时: 9ms, 内存消耗: 1024KB, 提交时间: 2022-06-15

class Solution {
  public:
    string simplifyPath(string path) {
        string a, b;
        if (path.back() != '/')
            path += '/';
        for (auto c : path) {
            if (c != '/')
                b += c;
            else {
                if (b == "..") {
                    while (a.size() && a.back() != '/')
                        a.pop_back();
                    if (a.size()) a.pop_back();
                } else if (b != "." && b != "") {
                    a += "/" + b;
                }
                b.clear();
            }
        }
        if (a.empty()) a = "/";
        return a;
    }
};

C++ 解法, 执行用时: 9ms, 内存消耗: 1024KB, 提交时间: 2022-03-07

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param path string字符串 
     * @return string字符串
     */
    string simplifyPath(string path) {
        string res, name;
        
        if(path.back() != '/') path += '/';
        
        for(auto c : path) {
            if(c != '/') name += c;
            else {
                if(name == "..") {
                    while(res.size() && res.back() != '/') res.pop_back();
                    if(res.size()) res.pop_back();
                } else if(name != "." && name != "") {
                    res += "/" + name;
                }
                name.clear();
            }
        }
        
        if(res.empty()) res = "/";
        
        return res;
    }
};

上一题