Yandex.Algorithm Open 2011: Qualification 1 B. Sequence Formatting (模拟)
题意:给定由数字,逗号,省略号(3个点)组成的字符串,要求输出规范格式后的字符串。
思路:简单模拟题,需要注意一些细节。
数字之后如果没有逗号需要空格。
如果省略号在开头则前面不需要加空格。
如果逗号后面是省略号则它们之间只能有一个空格。
字符串末尾不能有空格,如最后一个符号是逗号或者数字。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
#define il inline
string s,ans;
int main(){
getline(cin,s);
int n=s.size();
for(int i=0;i<n;){
int num=0;
while(i<n&&s[i]==' ') i++;
if(isdigit(s[i])){
while(i<n&&isdigit(s[i])){
ans+=s[i++];
}
if(isdigit(ans.back())) ans+=" ";
}
while(i<n&&s[i]==','){
if(ans.size()>1&&ans.back()==' '&&isdigit(ans[ans.size()-2])) ans.pop_back();
ans+=", ";
i++;
}
if(s[i]=='.'){
int cnt=0;
while(i<n&&s[i]=='.'){
cnt++;
if(cnt==3){
if(ans.empty()) ans+="...";
else if(ans.back()!=' ')
ans+=" ...";
else ans+="...";
cnt=0;
}
i++;
}
}
}
n=ans.size();
if(ans[n-1]==' ') ans.pop_back();
cout<<ans<<endl;
return 0;
}
总结:模拟题的 W A WA WA点就是细节和特殊情况的考虑。