1033. 旧键盘打字(20)

来源:互联网 发布:新日铁软件 编辑:程序博客网 时间:2024/05/16 03:45

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

输入格式:

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

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

输出格式:

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

输入样例:
7+IE.7_This_is_a_test.
输出样例:

_hs_s_a_tst


#include<iostream>
#include<string>
#include<math.h>
#include<vector>
using namespace std;


int main()
{
string a, b, c;
getline(cin, a);
getline(cin, b);
int flag = 0;
for (int i = 0; i < a.size(); i++)
{
char d;
if (a[i] >= 'A'&&a[i] <= 'Z')//如果存在大写的字母,那么对应的大小写字母都不准出现
{
d = a[i] + 32;
c += d;
c += a[i];
continue;
}
if (a[i] == '+')//如果存在+那么不允许出现所有的大写字母
{
flag = 1;
}
if (a[i] == '_')//如果存在_  我的理解是 _和空格都不准出现
{
c += ' ';
}
}
if (flag == 1)
{
c += "ABCDEFJHIGKLMNOPQRSTUVWXYZ";
}

a += c;//把所有不准出现的字符串合并

for (int i = 0; i < b.size(); i++)
{
if (a.find(b[i]) != string::npos)//说明发现了,string::npos   a.npos
{
b.erase(i, 1);
i--;//当我删掉了一个数字,那么后面的数字都会往上移动一位,那么i--,删掉的那位上来了新客人
}
}
if (b.size() == 0)
{
cout << endl;
}
else
{
cout << b << endl;//这就是所谓的空行?被坑了,打死没想到
}//我以为的空行,是" "。晕现在在想想,好像,endl,其实就是空行哈,脑子懵了


return 0;
}


plan B

#include<stdio.h>
#include<string.h>
int main()
{
    int key[178]={0};//储存坏键
    int i,check=0;//check核对是否有输出
    char ch;
    while((ch=getchar())!='\n')
    {
        if(ch>='A'&&ch<='Z')
key[ch-'A'+'a']=1;//字母大小写都存入
        key[ch]=1;
    }
    if(key['+'])
for(i='A';i<='Z';i++)
key[i]=1;//上档键坏掉,则所有大写无法打出
    while((ch=getchar())!='\n')
    {
        if(key[ch])continue;
        printf("%c",ch);
        check=1;
    }
    if(check==0)printf("\n");//如果没有输出,则输出\n
}

这个方法就赞多了。

a.find返回时指向返回的那个数字的迭代器iterator.  it=begin()+3,自己定义,

string::npos    和a.npos是我在做这道题的时候特意用我不怎么熟悉的语法去做的,具体数值,好像是个地址,记不清了,做这题是用不着那么清楚。

erase,在string上的用法有三种,我这里erase(x,z),x指的是从0开始的第几位,z是指删掉几个数值。也可以用it(迭代器)。