[PAT-B] 1023 旧键盘打字(C++)

题目

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

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

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

输入例子:
7+IE.
7_This_is_a_test.

输出例子:
_hs_s_a_tst


解题思路
1. 本题中需要处理两个地方
一是,第一组字符串中出现的字母,第二组字符串中无论该字母是否大小写都不输出
二是,若第一组字符串中出现“+”(代表上档键),则第二组字符串中所有大写字母都不输出
2. 对于第一种,只需要利用map将第一组字符串存入,之后对第二组字符串中每个元素进行m[a[i]]判断即可,而对于第二种,可用fg作为标志位进行处理
3. 本题在处理a[i]转小写时,可能会对其加上32,可是a[i]一定为大写字母么?举个例子,倘若该字符是“+”的话,根据ASCII码表,在加上32后会变成“K”,这样会影响判断,从而部分数据会报错。所以在处理这种情况下,要么调用ctype.h中的toupper()函数,要么判断下a[i]是否为字母,当然也可以有其他中操作,不过一定要注意a[i]得为字母方可+32

//主要算法
//zhicheng
map<char,bool> m;

bool fg=false;
//将第一组字符串存入m中,同时检查是否有“+”(代表上档键)存在
for(int i=0;i<a.length();i++) {if(a[i]=='+')fg=true;m[a[i]]=true;}
//对第二组字符串进行一一遍历
for(int i=0;i<b.length();i++)
{
    char tmp=toupper(b[i]);//如果是小写,将其转化为大写字母
    if(fg&&b[i]>='A'&&b[i]<='Z') continue;//若上档键已坏,大写字母都无法输出
    if(m[tmp]) continue;//判断下该元素是否也在第一组字符串中存在
    printf("%c",b[i]);  
}

铺子日常更新,如有错误请指正
传送门: 代码链接 题目链接 PAT-B题解

猜你喜欢

转载自blog.csdn.net/s_zhicheng27/article/details/81060413
今日推荐