PTA刷题Basic篇——1033.旧键盘打字——Day(17)

问题描述

在这里插入图片描述
先输入已经归坏掉的字符,要求我们在第二行输入的字符串中去掉这些字符,如果有+,则第二行字符中不能出现大写字母。

题目分析

我们创建一个bool类型的数组,遍历第一个字符串中的每一个字符,将对应的bool数组置为true,如果遍历到了大写字母,则要将坏掉字符中大写字母的小写字母也置为true。如果遇到了"+",我们就设置一个标记变量flag=1,表示我们输出的字符串中不能含有大写字母了。
然后我们再遍历第二个字符串,如果遍历到的字符不为true则可以输出。如果flag==1,则我们不可以输出大写字母。就这么简单。
但是还有一点需要说明,那就是第一行的坏掉字符串可能为空,就说明一个字符都没有坏掉,这种情况我们怎样输入呢,用空格吗?那样会被认为空格是坏键的。所以我们用getline()函数来进行输入,它允许我们输出一个纯空串。

代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<utility>
using namespace std;
#define MAXN 100010
string Std,wrong;
char res[MAXN];
bool useful[300];
int main()
{
    int i;
    //指示是否+坏掉了
    bool flag=true;
    int cnt;
    //防止读入空串,这里一定要注意,我们选择用getline读取
    getline(cin,wrong);
    getline(cin,Std);
    memset(useful,true,sizeof(useful));
    for(i=0;i<wrong.size();i++)
    {
        if((wrong[i]>='A'&&wrong[i]<='Z'))
        {
            useful[wrong[i]]=false;
            useful[wrong[i]+32]=false;
        }
        else if(wrong[i]=='+')
        {
            flag=false;
            useful[wrong[i]]=false;
        }
        else
            useful[wrong[i]]=false;
    }
    for(i=0,cnt=0;i<Std.size();i++)
    {
        if(!useful[Std[i]]||(Std[i]>='A'&&Std[i]<='Z'&&(!flag)))
            continue;
        else
        {
            printf("%c",Std[i]);
            cnt++;
        }
    }
    if(cnt)
        printf("\n");
    return 0;
}

答题用时15Min
Q33——finish√

原创文章 101 获赞 13 访问量 2309

猜你喜欢

转载自blog.csdn.net/weixin_44755413/article/details/105725842