🤭博主写完了今天给自己规定要完成的作业,就继续开启了我们的刷题之路。
咱们之前已经完成了: 1.如何让自己下定决心一定要刷题 2.一起备战蓝桥杯与CCF-CSP(1)
让咱们一步一个脚印,一起冲吧! 为了鼓励自己,鼓励大家,我们一次一个小鸡汤!
tips:由于博主也不厉害,所以可能之前写的博文中有bug或者有疑问,但是我解决了之后,都会将博文更新,并且进行相应说明,比如在(1)中,就对之前的bug进行了解决💕💕💕
我们要相信:世上无难事,只要肯登攀!
概览: 刷题体会 题目坑点&解题思路 正解与解决
好了,咱们正式进入主题。
先说今天刷题我领悟到的体会:
- 当输入字符串有空格时,一定要用getline读入,并且用了getline如果之前有读入(也就是说有用cin),我们都需要用到getchar(),至于getchar()的作用,我们已经在(1)中进行了讲解,这里,就不再cv啦。
- 编写中,相关操作能抽象成函数就抽相成函数,因为这样真的可以避免很多麻烦处理,这个我们在后续的代码中,大家就可以体会到,当然抽像成函数,可能也会造成一定的麻烦,比如传值的时候,这个咱就是说大家自己斟酌吧
- auto是真好用,他就是一个关键字,作用是可以帮你自动判断赋值的对象是什么数据,从而给你定义变量相应的类型。大家不了解的话可以去了解了解呀
- 变量名取的一定要有意义,这也符合工程规范
今天刷的题目是:2016-04-03:路径解析
大家可以点击链接去官网,具体题目如下: 题目坑点:
- 会有空串输入,所以我们读入得用getline,cin是读不进去的(别问我我怎么知道的)
- 其次,个人感觉其实题意描述的并不是很清楚,比如当前路径会不会随着规范而变化,感觉从样列也看不出来
解决思路:
- 直接硬模
- 输入的数据有两类 1.绝对路径,前面是’/’ 2.相等路径,也就是以‘…‘,’.‘开头,所以我们对这两类进行分别处理即可。
由于我们最重要的其实是处理字符‘/’,所以我们可以考虑将’/'去掉后,再进行操作。
上我的代码(没什么看头,大家可直接略过),用于反面教材:
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int n;
stack<string>sta;
int main()
{
int n;
cin>>n;
string s,temp1="";
cin>>s;
for(int i=0;i<s.size();)
{
if(s[i]=='/')
{
i++;
while( i<s.size() && s[i]!='/' )
{
temp1+=s[i];
i++;
}
sta.push(temp1);
temp1="";
}
}
while(n--)
{
string s1,temp="";
cin>>s1;
stack<string>st2;
for(int i=0;i<s1.size();)
{
temp="";
if(i+1<s1.size() && s1[i]=='.' &&s1[i+1]=='/')
{
i+=2;
}
else if(i+1<s1.size() && s1[i]=='.' && s1[i+1]=='.' )
{
i+=3;
int j=i;
while(s1[j]!='/')
{
temp+=s1[j++];
}
while(!sta.empty() && sta.top()!=temp)
{
sta.pop();
}
while(!sta.empty())
{
cout<<sta.top();
sta.pop();
cout<<"/";
}
i=j+1;
}
else if(s1[i]=='/')
{
cout<<'/';
i++;
while(s1[i]=='/')
{
i++;
}
}
else
{
while(i<s1.size() && s1[i]!='/' )
{
temp+=s1[i++];
}
cout<<temp;
st2.push(temp);
temp="";
}
}
cout<<endl;
sta=st2;
}
return 0;
}
没啥好说的,就是按照题目来,由臭又长不说,过了样例交了一发。 Acwing一个点没过,官网过30%。
看了看y总讲解,似懂非懂,但是给了我很多写代码的启发,浅写了一下代码是干嘛的:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
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;
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()
{
int n;
string str;
cin >> n >> str;
vector<string> cur = get(str), ap;
getchar();
while (n -- )
{
getline(cin, str);
auto path = get(str);
if (str.size() && str[0] == '/') walk(ap, path);
else walk(cur, path);
}
return 0;
}
作者:yxc
链接:https:
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
好了,对比了y总代码,我写的是真的lj😭😭😭,就当给大家反面教材了,以后的码风一定像y总靠拢。
一起加油!!!??????
|