题目描述
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入描述
输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 10 e5个字符的串。可用的字符包括字母 [a-z, A-Z]、数字 0-9、以及下划线 _(代表空格)、,、.、-、+(代表上档键)。题目保证第 2 行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出描述
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
示例:
输入
7+IE.
7_This_is_a_test.
输出
_hs_s_a_tst
解题思路
首先读取坏掉的按键的字符串,将大写字母转换为小写字母(如果小写转大写会很麻烦在后面的判断),读取到的字符在HashTable中变为false,表示该按键不能使用;
之后读取输入的字符串,遍历改字符串,判断是否能够使用,如果遇到的是大写字母,就就判断换挡键“+”和对应的字母按键是否能够使用,两者同时满足才要打印出来,如果是其他字符只需要判断改按键是否损坏(大大写转小写的好处),不损坏就打印出来;
这里在测试点2一直报错,是因为忽略的题目的第一行可能是个空行,也就是没有按键损坏的情况,scanf
遇到刚开始就是换行的会忽略这个换行,只有在输入了数据之后的下一个换行才是结束的标志。这里可以直接使用gets或者c++版本的getline(cin,str),比较建议后者,因为PAT的c++编译器不支持gets,处理起来比较繁琐。
参考代码
#include<iostream>
#include<cstring>
using namespace std;
bool HashTable[256];
int main() {
string str;
memset(HashTable, true, sizeof(HashTable)); //初始化按键全部可以使用
getline(cin, str);//这里是数据读取的重点
for (int i = 0; i < str.length(); ++i) {
if (str[i] >= 'A' && str[i] <= 'Z') {
str[i] += 32; //大写转为小写
}
HashTable[str[i]] = false;//false说明按键坏了
}
getline(cin, str);
for (int j = 0; j < str.length(); ++j) {
if (str[j] >= 'A' && str[j] <= 'Z') {
char temp = str[j] + 32; //先转为小写判断按键
if (HashTable[temp] == true && HashTable['+'] == true) {
printf("%c", str[j]);
}
} else if (HashTable[str[j]] == true) {//如果是小写转大写还需要在这里再次分类判断
printf("%c", str[j]);
}
}
printf("\n");
return 0;
}