【ccf-csp题解】第7次csp认证-第三题-路径解析超详细题解-字符串模拟

本题思路来源于acwing ccfcsp认证课

题目描述

思路分析

首先,为了处理路径中的反斜杠符号,我们可以实现一个get函数,把一个路径中每一对反斜杠之间的内容存到vector<string>中,如果有连续的多个反斜杠则只看成一个

举个例子:

路径为:/d1/d2/d3  可以变为:vector<string>path;其中path[0]=="d1" path[1]=="d2" path[2]=="d3"

路径为:/d1//d2//d3/ 也可以变为:跟上面一样的path

如何实现这个函数呢?直接遍历即可:

vector<string>get(string str)
{
    vector<string>res;
    for(int i=0;i<str.size();i++)
    {
        if(str[i]=='/')continue;
        int j=i+1;
        while(j<str.size()&&str[j]!='/')j++;//包含遍历结束和遇到下一个'/'两种情况
        res.push_back(str.substr(i,j-i));
    }
    return res;
}
    

对于给出的当前目录,我们就可以直接把其转换为vector<string>类型的cur了

紧接着,我们会输入n个样例,需要注意的是,样例有可能为空串(此时答案就会输出当前目录)

如果依然用cin,就会忽略这个空串,所以我们用getline

既然使用了getline,我们就需要在之前的cin后面加一个getchar()吸收回车

接下来,我们看如何处理样例

第一步依然是把输入的string用get函数进行路径拆分编程vector<string>类型的path,然后需要去判断这个path是绝对路径还是相对路径,只需要看第一个字符是不是'/'(当然还需要空串特判,这个就不多说了)

我们再实现一个函数:void walk(vector<string>cur,vector<string>path)

这个函数可以在cur的基础上把后面的path(可能包含"."和"..")添加进来,同时输出最终结果

如果是空串或者是相对路径,我们这样调用walk:

walk(cur,path);

如果是空串的话,path就是空,就会输出cur的路径形式

否则,就是输出把path加到cur之后的cur的路径形式

如果是绝对路径,我们这样调用walk:

walk(ab,path);

其中ab是空的vector<string>

最后我们看,如何实现walk函数

利用cpp的foreach写法,直接遍历path中每一个字符串:

如果是"."直接continue

如果是"..",如果cur是空,则continue(因为根目录的上一级还是根目录),否则就删掉一个cur中的string

如果是其它,直接把这个字符串push_back到cur的后面

最后,如果cur是空,输出"/",return 即可

否则,foreach遍历cur,每次输出一个string之前,别忘加一个'/'哦

一百昏代码

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int n;
string str;
vector<string>get(string str)
{
	vector<string>res;
	for(int i=0;i<str.size();i++)
	{
		if(str[i]=='/')continue;
		int j=i+1;
		while(j<str.size()&&str[j]!='/')j++;
		res.push_back(str.substr(i,j-i));
		i=j;
	}
	return res;
}
void walk(vector<string>cur,vector<string>path)
{
	for(auto p:path)
	{
		if(p==".")continue;
		else if(p=="..")
		{
			if(cur.size())cur.pop_back();
		}
		else
		cur.push_back(p);
	}
	if(cur.empty())
	{
		puts("/");
		return;
	}
	for(auto p:cur)
		cout<<"/"<<p;
	cout<<endl;
}
int main()
{
	cin>>n>>str;
	vector<string>cur=get(str);
	vector<string>ab;
	getchar();
	while(n--)
	{
		string examp;
		getline(cin,examp);//因为有可能有空串,所有不用cin
		vector<string>path=get(examp);
		if(examp.size()&&examp[0]=='/')walk(ab,path);
		else walk(cur,path);
	}
	return 0;
}

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值