题目
输入
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不熟悉,有很多我想到的操作无法用代码实现出来)