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

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

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YuannaY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值