PAT 1033 旧键盘打字 (20分) 测试点2分析

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

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

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

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

输入样例:

7+IE.
7_This_is_a_test.

输出样例:

_hs_s_a_tst

题目分析:

  1. 先输入s1,s2。并且由于s1可能是空字符串,所以不能用cin>>s1>>s2,因为cin>>s1不接收空串。所以s1需要用getline接收(测试点2)
  2. 善用string中的s.find()函数。s.find(' 某个字符 c ')会查找字符串s中是否存在字符c。如果存在则返回字符c的位置(return pos),如果不存在则返回string::npos
  3. 遍历字符串s2,并且判断s1中是否有‘+’键,如果有就一律不输出大写字母。如果没有,再判断s2中的字符转成大写后是否是坏键,如果s1中未找到(表示不是坏键)则输出。

AC代码

#include
using namespace std;
int main()
{
	string s1,s2,s3="";
    getline(cin,s1);//测试点2
	cin>>s2;
	for(auto x:s2)//遍历字符串s2
	{
		if(s1.find('+')!=string::npos && isupper(x) ) continue;//存在'+'表示上档键坏了,又遇到大写字母,跳过不输出
		if(s1.find(toupper(x))==string::npos)//s1中没找到,没坏,可以输出  
			s3+=x;
	}
	cout<<s3;
	return 0;
 } 

小Tips:善用string.find()函数就会变得很容易

你可能感兴趣的:(PAT 1033 旧键盘打字 (20分) 测试点2分析)