CF81B Sequence Formatting - 题解
一看题目内容,这道题看似是道模拟,实际上确实是道模拟。
解析
题目中分四种类型:整数、逗号、空格、省略号。我们来分类讨论:
-
整数:无需处理,直接塞到 \(s\) 里面就行了。
-
逗号:往 \(s\) 里面加一组
,(即一个逗号加一个空格)。 -
空格:当两个整数内包含多个空格时,只保留一个。即只有前一个是数字时才加入空格,其它忽略。
-
省略号:省略号的处理较为复杂,需要分成每三个一组。我们可以用一个变量表示输入
.的个数,当其为 \(0\) 时输出.(空格加点),否则只输出.;当其达到 \(3\) 时意味着一组省略号已完成,需要将其清零以便下一组省略号(如果有的话)输出空格。
这样做可能产生连续空格,输出时需要再判断一下,连续空格只输出 \(1\) 个。
还有一种特殊情况,输入 1 , 2 时会输出 1 , 2,数字和逗号之间多了一个空格。输出时特判一下就好了。
另外,还有一个注意事项:末尾不能额外输出空格或换行,所以末尾的空格还需要处理一下。
具体实现请看代码注释。
这样,就能正确输出答案了。
代码:
#include<cstdio>
using namespace std;
char s[10005]; //s 储存最终结果,从 s[1] 开始
int len=0; //len 表示 s 的长度
int main()
{
int dot=0; //dot 用来表示 . 的个数
while(true)
{
char ch=getchar(); //输入单个字符
if(ch=='\n') break; //如果输入完成则退出循环
if(ch==' ') //情况 3
{
if(s[len]>='0'&&s[len]<='9')
s[++len]=' ';
else continue;
}
if(ch>='0'&&ch<='9') //情况 1
s[++len]=ch;
if(ch==',') s[++len]=',',s[++len]=' '; //情况 2
if(ch=='.') //情况 4
{
if(dot==0&&(s[len]!=' '&&len!=0)) s[++len]=' ';
s[++len]='.';
dot++;
if(dot==3) dot=0;
}
}
while(s[len]==' ') len--; //循环处理字符串末尾字符
for(int i=1;i<=len;i++)
{
if(s[i]==' '&&s[i-1]==' ') continue; //判断连续空格
if(s[i-1]>='0'&&s[i-1]<='9' && s[i]==' ' && s[i+1]==',')
continue; //“数字+空格+逗号”的特殊情况判断
putchar(s[i]);
}
return 0;
}
\[\large\frak{The\ End}
\]
2022-07-28 10:08 撰写于洛谷,2025-08-29 20:31 迁移至博客园。
本文采用 「CC-BY-NC 4.0」 创作共享协议,转载请注明作者及出处,禁止商业使用。
作者:Jerrycyx,原文链接:https://www.cnblogs.com/jerrycyx/p/19065132

浙公网安备 33010602011771号