LeetCode 71 Simplify Path题解

首先上题目内容
在这里插入图片描述
该题想让我们对于输入的文件名信息进行转换。对于Linux目录文件的特点这里笔者再做几点强调:

  1. 一个点代表当前目录;
  2. 两个点代表上一级目录;
  3. 最简格式每一级目录间只能有一个/;
  4. 文件末尾不能带有/;

然后关键的问题是怎样进行转换呢?请看如下测试案例
在这里插入图片描述
细心一点会发现,比如/a/…/…/b/…/c//.//,每逢…退回上一级目录,每逢.保持当前目录。这里可以用栈来模拟这个过程。即:

  1. ‘…’表示退栈;
  2. 两个/之间是文件名的情况则入栈。
  3. 最后所有元素出栈
    注意栈中元素的顺序是与实际文件名的顺序相反,最后处理时需要考虑到这个点
    接下来上代码:
string simplifyPath(string path) {
        stack<string> finall;
        vector<string> tempf;
        string finalls="";
        for(int i=0;i<path.size();i++)
        {
            //如果字符是‘/’,则不需要处理。
            if(path[i]=='/')
                continue;
            //否则就是其他字符,即文件夹的名字
            else
            {
                int j=i;
                //通过遍历找到下一个‘/’,表示该文件夹名的终止位置。
                for(;j<path.size();j++)
                {
                    if(path[j]=='/')
                        break;
                }
                string temp=path.substr(i,j-i);
                //处理具有特殊含义的字串如.,..
                //如果字串是..,则表示返回上一级目录,出栈操作。
                if(temp=="..")
                {
                    if(!finall.empty())
                        finall.pop();
                }
                //如果字串是.,表示当前目录,不做任何处理。
                else if(temp==".")
                {
                    continue;
                }
                //否则就是正常的文件名,入栈操作
                else
                {
                    finall.push(temp);
                }
                i=j;
            }
        }
        if(finall.empty())
            return "/";
        //由于出栈后文件名的顺序是由内到外,需要利用一个vector来暂存信息,最后反向输出vector的信息
        while(!finall.empty())
        {
            tempf.push_back(finall.top());
            finall.pop();
        }
        for(int i=tempf.size()-1;i>=0;i--)
        {
            finalls+="/"+tempf[i];
        }
        return finalls;
    }

然后例常来张结果图纪念:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值