1033 旧键盘打字(20)(20 分)
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入格式:
输入在2行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过10^5^个字符的串。可用的字符包括字母[a-z, A-Z]、数字0-9、以及下划线“_”(代表空格)、“,”、“.”、“-”、“+”(代表上档键)。题目保证第2行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出格式:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
输入样例:
7+IE.
7_This_is_a_test.
输出样例:
_hs_s_a_tst
心得笔记:
1.因为cin会把空格和换行作为无效字符,遇到后,则直接终止字符串的读入。
因此可以采用getline((),并不忽略换行符。如果第一个字符为换行符,则将该字符串置为空串。
2.注意字母键盘不区分大小写,只要这个字母键坏,则大小写均无法输出。
我用了toupper()这个函数,如果是小写字母则转换为大写字母,否则返回原值。
3.关于"+",我是用find()函数,做了标记。如果找到"+",则只要是大写字母都不能输出。
4.我发现我写的代码运行时间和内存一直偏大,百度了一段这道题的写法,感觉不错,分享一下:
然后,我的代码如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string h,y;
char th,ty,c;
int lenH,lenY,flag=0,temp=0,k=1;
getline(cin,h);//如果遇到第一行为空,则h将被置为空string。
cin>>y;
lenH = h.size();
lenY = y.size();
if(h.find("+")!=string::npos)
{//检测是否能输出大写字母
temp=1;
}
for(int i=0;i<lenY;i++)
{
flag = 0;
ty = toupper(y[i]); //把小写字母转换成大写,如果不是小写字母,则返回原来的值
for(int j=0;j<lenH;j++)
{
th = toupper(h[j]);
if((ty==th)||((temp==1)&&(y[i]>='A')&&(y[i]<='Z')))
{//符合条件的都做淘汰标记
flag=1;
break;
}
}
if(flag)
{
continue;
}
cout <<y[i];
k=0;//是否有输出的标记
}
if(k)
{//如果一个也没法输出,则输出空行
cout<<"\n";
}
system("pause");
return 0;
}