旧键盘打字——看似简单实则暗坑汹涌。

1033 旧键盘打字(20)(20 分)

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?

输入格式:

输入在2行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过10^5^个字符的串。可用的字符包括字母[a-z, A-Z]、数字0-9、以及下划线“_”(代表空格)、“,”、“.”、“-”、“+”(代表上档键)。题目保证第2行输入的文字串非空。

注意:如果上档键坏掉了,那么大写的英文字母无法被打出。

输出格式:

在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。

输入样例:

7+IE.
7_This_is_a_test.

输出样例:

_hs_s_a_tst
//原先的想法差不多,就是输入两个字符串,然后得到两个字符串长度,将第一个字符串出现的字符隔离,然后输出第二个字符串未被隔离的字符。

原先代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char input[1001000];
    char output[1001000];
    gets(input);
    gets(output);
    int l1=strlen(input);
    int l2=strlen(output);
    int i,j,up=1;
    for(i=0; i<l1; i++)
    {
        if(input[i]=='+')
        {
            up=0;//标志,大写字母隔离。
        }
    }
    for(i=0; i<l2; i++)
    {
        if(up==0)
        {
            if(output[i]>='A'&&output[i]<='Z')//隔离大写字母。
            {
                output[i]='\0';
              
            }

        }
        for(j=0; j<l1; j++)//这里想法很淳朴,就是想通国一个二重循环隔离第二个字符串中的字符。但是复杂度是O(N*N),太大了,所以最后一个测试点没过。
        {
            if(input[j]==output[i])
            {
                output[i]='\0';
            }
            if(input[j]-'A'+'a'==output[i])
            {
                output[i]='\0';
                
            }
        }
    }
else
{
     for(i=0; i<l2; i++)
    {
        if(output[i]!='\0')
            printf("%c",output[i]);
    }
}
    return 0;
}
查看大神代码后的启发:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char input[100100];
    char output[100100];
    int cov[128]= {0};//此处收大神启发,ascll码128位。
    gets(input);//scanf不能识别换行符,此处是一坑,第三个测试点就是第一行为空,即没有键坏的情况。只能用gets;此处卡了很久。
    gets(output);//此处可以用scanf,
    int  l1=strlen(input);
    int  l2=strlen(output);
    int i,j;
    for(i=0; i<l1; i++)
    {
        if(input[i]>='A'&&input[i]<='Z')//将坏的键隔离,大小写字母全隔离。
        {
            cov[input[i]-'\0']=1;
           cov[input[i]-'A'+'a'-'\0']=1;
        }

        else if(input[i]=='+')//若有+,不仅要隔离+本身,还要隔离所有大写字母
        {
            for(j='A'; j<='Z'; j++)
            {
                cov[j-'\0']=1;
               cov['+'-'\0']=1;
            }
        }
        else//剩余其他键逐一隔离
        {
            cov[input[i]-'\0']=1;
        }
    }
//处理输出的字符串,隔离过的不能输出,其余按照原先字符串顺序输出。
    for(i=0; i<l2; i++)
    {
        if(cov[output[i]-'\0']==0)
            printf("%c",output[i]);

    }
若全部隔离,输出空行。
    printf("\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/YuannaY/article/details/80878173