程序设计思维与实践 月模拟题2 Blog

CSP-201604-3路径解析

题目具体描述不再粘贴,如有需要可参照CSP模拟考试网址。

题目分析

  这道题目的思路较为简单,主要考察细心程度,不要因为考虑不全而丢分。而具体的实现其实有两种方式:

  • 使用作为数据结构,不断地输入, 对于需要正规的符号直接忽略或者处理
  • 直接根据输入进行判断,直接模拟

  下面只介绍直接模拟的方法,因为思路比较直接,而且具体写起来也并不麻烦。首先需要判断路径的情况,如果是绝对路径

  • 如果是 / . / /./ /./ 直接删除 . / ./ ./
  • / / // // 两个 / / / 直接删除一个
  • / . . / /../ /../ 需要区分第一个/是根目录还是普通的 / . /. /.对于前者删除三个符号即可; 对于后者需要从/往前遍历,找到前一个/,将这中间的全部删去.

以上情况处理完成之后还需要考虑末尾的情况: /… /. /对于这三种情况需要从最后一个/开始都删除。
  如果是相对路径:从开头添加相对路径从而转化为绝对路径。
  如果是空字符串:直接输出当前路径。
  下面是题目的全部代码:

#include<iostream>
using namespace std;
int main()
{
	int cnt;
	string path,cur;
	cin>>p>>cur;
	getchar();
	for(int i=0;i<cnt;++i)
	{
		getline(cin,path);
		if(path.size()==0)
		{
			cout<<cur<<endl;
			continue;
		}
		if(path[0]!='/')path=cur+"/"+path;
		int a;
		while((a=path.find("/./"))!=-1)
			path.erase(a,2);
		while((a=path.find("//"))!=-1)
			path.erase(a,1);
		while((a=path.find("/../"))!=-1)
		{
			if(a==0)path.erase(0,3);
			else
			{
				int x=path.rfind("/",a-1);
				path.erase(x+1,a-x+3);
			}
		} 
		if(path.size()>1)
		{
			int y=path.rfind("/",path.size()-1);
			if(y==path.size()-1 || path[y+1]=='.')
			path.erase(y,path.size()-y);
		}
		cout<<path<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值