题目描述
芭芭拉是西风教会的祈礼牧师,同时也是蒙德城的闪耀偶像。
只要看到芭芭拉,心情就能变好。——蒙德城里流传着这样的说法。
人们接受芭芭拉的歌声,逐渐被她的活力感染。
和往常一样,芭芭拉即将登台表演,可她却突然发现自己的歌谱出现了问题,为了正常完成演出,请你能帮她复原歌谱。
具体的,芭芭拉的歌谱被表示成一个字符串,这个字符串在标准的情况下仅由小写字 母和空格组成,并且连续的空格最多只能有一个。当前的歌谱由于某些原因,还含有 一些数字和大写字母,并且可能有多个连续空格和换行,所以当前的歌谱不标准。
你需要将其还原成标准歌谱,形式化的,标准歌谱仅有小写字母和空格组成,开头不 包含空格,单词和单词之间由一个空格分开。
注意换行符在 Windows 下为 \r\n 而不是\n。
输入格式
若干行字符串
输出格式
一行字符串,表示标准歌谱
样例
【样例 1 输入】
Cor5ru2pt1 2 3 BinAry
codEs inFecting My
mInd
【样例 1 输出】
corrupt binary codes infecting my mind
数据范围与提示
特殊性质 A:不存在大写字母
特殊性质 B:不存在数字
特殊性质 C:不存在连续空格
最大长度为10^5.
希望给出代码!
遍历字符串,删除多余空格、数字和特殊字符,将大写字母转为小写,即可。
运行结果:
代码:
#include <iostream>
#include <string>
using namespace std;
//判断字符是否是小写字母
int islower(char c)
{
if (c >= 'a' && c <= 'z')
return 1;
else
return 0;
}
//判断是否是大写字母
int isupper(char c)
{
if (c >= 'A' && c <= 'Z')
return 1;
else
return 0;
}
//判断是否是字母
int isCharacter(char c)
{
if (islower(c) || isupper(c))
return 1;
else
return 0;
}
int main()
{
char a[100005] = { 0 };
int shift = 0;
while (cin.getline(a + shift, 100005 - shift) )
{
shift = strlen(a);
a[shift] = ' ';//每行后面加一个空格
shift++;
}
//删除最后添加的空格
while (shift>=0 && a[shift - 1] == ' ')
{
a[shift - 1] = 0;
shift--;
}
//遍历数组
int i = 0, j = 0;
while (isCharacter(a[i]) == 0) //过滤非字母
i++;
while (a[i] != '\0')
{
if (islower(a[i]))
a[j++] = a[i];
else if (isupper(a[i])) //大写转小写
a[j++] = a[i] + 32;
else if (a[i] == ' ') //如果是空格
{
if (j > 0 && a[j-1] != ' ')//前一个字符不是空格
a[j++] = ' ';
}
else if (a[i] == '\r' || a[i] == '\n')//回车符
{
if (j > 0 && islower(a[j - 1]))
a[j++] = ' ';
}
i++;
}
a[j] = 0;
cout << a;
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!