龙星尘 2023-01-29 11:10 采纳率: 42.9%
浏览 52
已结题

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.

希望给出代码!

  • 写回答

2条回答 默认 最新

  • 关注

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

    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;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月6日
  • 已采纳回答 1月29日
  • 创建了问题 1月29日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效