【PAT 乙级】1033 旧键盘打字

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.我发现我写的代码运行时间和内存一直偏大,百度了一段这道题的写法,感觉不错,分享一下:

1033 旧键盘打字(C语言版)

然后,我的代码如下:

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

猜你喜欢

转载自blog.csdn.net/CrystalXueNing/article/details/80910728