unix合法全路径转化并打印其格式化全路径

题目描述

现输入一个合法全路径转化并打印其格式化全路径
Linux系统中, 文件全路径以 ’ / / / ’ 开头和作为分隔符, 开头的 ’ / / / '为根目录, 作为分 隔符的 ’ / / / ’ 表示一层目录。
以 文件全路径 “/a/b/file.c” 为例。
a a a ’ 为根目录 ‘/’ 下的子目录
‘b’ 为目录 ‘/a’ 下的子目录
‘file.c’ 为目录 ‘/a/b’ 下的子文件
合法的全路径包含元素:
允许出现多个连续的 / \mathrm{/} /, 与一个 ’ / \mathrm{/} / ’ 等价。例如:“a” 表示目录 ‘/a’
允许出现特殊目录 "." ".." , 其中 "." 表示当前层次目录;".." 示当前层次目录 的父目录(根目录的父目录为根)。例如:"/a." 表示目录"/a""/a/.." 表示目 录 "/""/a/b/../.." 表示目录 "/"
格式化的全路径有以下要求:
以 ’ / / / ’ 开头, 不存在连续的 ’ / / /
不存在特殊目录 "." ".." , 需要转化为等价目录
不以 / / / 结尾 (根目录除外, 根目录的全路径输出即为 “/”)
比如合法全路径 "/a///b//c/..././" 的格式化全路径为 "/a/b"

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

参考

[编程题]简化路径

链接:https://www.nowcoder.com/questionTerminal/393e5a246a7546d1b2e4d7719647b7d9
来源:牛客网

请简化给出的Unix样式的文件绝对路径,也就是转换成规范路径
在Unix样式的文件系统中, .代表当前目录,..表示将目录向上移动一级,更多的介绍可以查看 Absolute path vs relative path in Linux/Unix
请注意,返回的规范路径必须以斜杠“/”开头,并且两个目录名之间只能有一个斜杠“/”开头。如果存在的最后一级目录的话不能以“/”结尾。另外,转化出的规范路径必须是能表示给出的绝对路径的最短字符串。
例如:
文件路径 = "/web/", =>"/web"
文件路径 = "/a/./b/../../c/", =>"/c"
特殊样例:
你有考虑过样例 文件路径 ="/../"吗? 这个样例应该返回"/".
另一种特殊样例是路径中可能相邻的有多个“/”,例如“/home//web/”。这种情况下应该忽略多余的“/”,这个样例应该返回"/home/web".

示例1
输入
"/./"
输出
"/"

示例2
输入
"/.."
输出
"/"

示例3
输入
"/..."
输出
"/..."
class Solution {
public:
    string simplifyPath(string path) 
    {
     vector<string> res;
    stringstream ss(path);
    string sub;
    while(getline(ss,sub,'/'))
    {
        if(sub=="." || sub=="")
            continue;
        else if(sub==".." && res.size())
            res.pop_back();
        else if(sub != "..")
            res.push_back(sub);
    }
    string result;
    for(string temp : res)
        result += '/'+temp;
    return res.empty() ? "/" : result;  
    }
};

NC299 简化目录路径

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

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


数据范围:
1 ≤ 1 \leq 1 path.length ≤ 1 0 5 \leq 10^5 105

示例1
输入:
"/home/web/"
返回值:
"/home/web"

示例2
输入:
"/homeweb//"
返回值:
"/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" 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值