C++算法题求解(字符串)

题目描述
芭芭拉是西风教会的祈礼牧师,同时也是蒙德城的闪耀偶像。

只要看到芭芭拉,心情就能变好。——蒙德城里流传着这样的说法。

人们接受芭芭拉的歌声,逐渐被她的活力感染。

和往常一样,芭芭拉即将登台表演,可她却突然发现自己的歌谱出现了问题,为了正常完成演出,请你能帮她复原歌谱。

具体的,芭芭拉的歌谱被表示成一个字符串,这个字符串在标准的情况下仅由小写字 母和空格组成,并且连续的空格最多只能有一个。当前的歌谱由于某些原因,还含有 一些数字和大写字母,并且可能有多个连续空格和换行,所以当前的歌谱不标准。

你需要将其还原成标准歌谱,形式化的,标准歌谱仅有小写字母和空格组成,开头不 包含空格,单词和单词之间由一个空格分开。

注意换行符在 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.

希望给出代码!

遍历字符串,删除多余空格、数字和特殊字符,将大写字母转为小写,即可。
运行结果:

img

代码:

#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;
}


您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632