对于此题,我的心近乎崩溃
这道题,注意点没有什么,相信大佬们是可以自己写出来的 我是蒟蒻,那我是怎么写出来的啊
好了,废话少说,开始进入正题
这道题,首先我想到的是字符串的 erase 函数,一边运行一边删除多余的字符
但是……
在删除的同时,串长也会变化啊!!( 绝望
所以,在直接删的情况下:
for 不能用……
while 不能用……
do while 不能用……
这里,我又想到了……
正难则反
不减掉字符,就可以再定义一个字符串 ( 空串 ) 把满足的字符加进字符串里呀!!
这样,我们又可以得出满足字符的条件:
· 上一个字符不是 ' / ' ,但是这一个字符是 ' / '
· 数字
最后,如果最后一个字符是 ' / ' ,就删去它
所以,我们得出了核心代码:
ans+=s[0];
for(i=1;i<len;i++){
if((s[i-1]!='/'&&s[i]=='/')||s[i]!='/') ans+=s[i],k++; } if(ans[k]=='/') ans.erase(k);
很简单吧?
但是,你把代码放上去测,明显地……
WA辣!
证据:
所以,我们留意到了特殊情况:
如果你输入了
/////
出来的是
nothing?
What ? 没有结果?
我瞬间认识到了:
我需要特判!!
所以,改进代码如下:
if(ans=="")//如果全是 '/' ,删完了的话
cout<<"/"; else cout<<ans;
就这样结束了?
好像是的
所以,放出代码最终版:
#include<bits/stdc++.h>
using namespace std;//本蒟蒻总会写 int i,len,k; string s,ans; int main(){ getline(cin,s); len=s.size(); ans+=s[0]; for(i=1;i<len;i++){ if((s[i-1]!='/'&&s[i]=='/')||s[i]!='/') ans+=s[i],k++;//记下ans有多少位 } if(ans[k]=='/') ans.erase(k);//erase函数,温习一下 if(ans=="") cout<<"/"; else cout<<ans; return 0; }
OI 加油!洛谷冲鸭!