CSP201604-3 路径解析

题目
在这里插入图片描述

在这里插入图片描述

输入
7
/d2/d3
/d2/d4/f1
…/d4/f1
/d1/./f1
/d1///f1
/d1/
///
/d1/…/…/d2

输出
/d2/d4/f1
/d2/d4/f1
/d1/f1
/d1/f1
/d1
/
/d2

在这里插入图片描述

我的解法
我是按照他的要求一步一步做的,但是按我的思路来写只能得80分,结果是运行错误,不知道该怎么修改了。

#include<iostream>
#include<string>
using namespace std;

string now; //当前路径 
int p;
string index;

string result[11];
int ri;
int sizeOFrow[11]; //每行答案的长度
int sizei;

int main()
{
	ios::sync_with_stdio(0);
	cin>>p>>now;
  	cin.get();

	for(int in=0;in<p;in++)
	{
		string index;
		getline(cin,index);
		ri=0;
		if(index[0]!='/')  //相对路径变成绝对 
		{
			for(int id=0;id<now.size();id++)
			{result[in][ri] = now[id];
			ri++;}
			if(ri>0)  {
			if(result[in][ri-1]!='/') 
			result[in][ri++] = '/';}
		} 
			int flag1 = 0;   
			int flag2 = 0;//标记 . 
			for(int i=0;i<index.size();i++)
			{
					if(index[i] == '/')
					{
						if( ri>0 )
						{		
						if(result[in][ri-1]=='/') continue;
						if(result[in][ri-1]=='.' && flag1==flag2 )  //完全是点 
						{
							if( flag2==1)   //不变 
							{
								while(ri>0 && result[in][ri-1]!='/') ri--;
								flag1= 0;
								flag2=0;
								continue;
							}
							if(flag2==2) //回退
							{
								flag1=flag2=0;
								while(ri>0 && result[in][ri-1]!='/') ri--;
								if(ri==1) continue; 
								ri--;
								while(ri>0 && result[in][ri-1]!='/') ri--;
								continue;
							} 
						}
					}
					flag1=flag2=0;	
				}
					else if(index[i]=='.') {flag2++;}
					result[in][ri++] = index[i];
					if(index[i]!='/')
					flag1++;
					
			}		
		sizeOFrow[sizei++] = ri;	

	}	
	for(int i=0;i<p;i++)
	{
		int s_o_r = sizeOFrow[i];
		for(int j=0;j<s_o_r;j++)
		{if(j==s_o_r-1&&result[i][j]=='/'&&s_o_r!=1) continue;
		cout<<result[i][j];
		}
		cout<<endl;
	}
	return 0;
}

参考了网上的思路后

#include<iostream>
#include <sstream>
#include<vector>
using namespace std;
string now,s,s1;
int p;
vector<string> vs;

int main()
{
	cin>>p>>now;
	cin.get();  //把换行吃掉 ,因为getline会吃换行
	for(int I=0;I<p;I++)
	{
		getline(cin,s);
		//cout<<s<<" ** "<<endl;
		if(s=="")  s = now;    
		if(s[0] != '/')  //如果不是绝对地址,变为绝对地址
		s = now +'/'+ s;
		 
		// cout<<index<<"--"<<endl;
		 for(int i=0;i<s.size();i++)
		  {if(s[i]=='/')  s[i]=' ';}
		  
		stringstream ss(s); 
		while(ss >> s1) 
		{
			if(s1 == ".") continue;
			else if(s1 == ".." && !vs.empty()) {vs.pop_back();}
			else if(s1 !="..") vs.push_back(s1);
		}
		cout<<'/';
		for(int i=0;i<vs.size();i++)
		{
			if(i) cout<<'/';
			cout<<vs[i];
		}
		cout<<endl;
		vs.clear();
	 } 
}

小结
因为用了sstream,所以代码非常的简短,我只想说太妙了
(我觉得我对字符串string类型,和sstream这里非常不熟悉,甚至都不知道有sstream这个包,所以也想不到用这种这么妙的方法,而且对string不熟悉,有很多我想到的操作无法用代码实现出来)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值