1033 旧键盘打字 (20 分)
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入格式:
输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 105 个字符的串。可用的字符包括字母 [a
-z
, A
-Z
]、数字 0
-9
、以及下划线 _
(代表空格)、,
、.
、-
、+
(代表上档键)。题目保证第 2 行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出格式:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
输入样例:
7+IE. 7_This_is_a_test.
输出样例:
_hs_s_a_tst
代码:
(1)
#include<stdio.h> #include<string.h> #include<stdbool.h> int main() { char invalid[128] = { 0 }, str[100010] = { 0 };//invalid存放输入的坏键字符串,str存放输入字符 bool Invalid[128] = { false };//Invalid数组标记坏键 gets(invalid); gets(str); int invalidLen = strlen(invalid);//得到坏键字符串的长度 int len1 = strlen(str);//得到输入的字符串长度 int shiftValid = 1;//判断是否上档键坏了 for (int i = 0; i < invalidLen; i++) {//遍历坏键数组 int temp = invalid[i];//保存输入数组当前字符的ASCII码值 Invalid[temp] = true;//对bool数组Invalid对应的元素改为TRUE if (invalid[i] >= 'A' && invalid[i] <= 'Z'){//如果当前是字母 Invalid[temp + 32] = true;//则对它的小写也改为TRUE } if (invalid[i] == '+') {//如果是'+' shiftValid = 0;//将上档键标记改为0 } } for (int i = 0; i < len1; i++) {//遍历输入数组 int temp = str[i];//保存输入数组当前字符的ASCII码值 if (Invalid[temp] == false) {//判断对应的Invalid数组元素是否为false if (shiftValid == 0 && str[i] >= 'A' && str[i] <= 'Z'){//判断上档键标记和是否属于大写字母 continue;//满足条件,跳出本次循环 } printf("%c", str[i]);//不满足条件,输出字符 } } return 0; }
(2)
#include<stdio.h> #include<string.h> #include<stdbool.h> char str[100010]; bool hashTable[256]; //散列数组,用以记录键盘上的字符是否完好 int main() { memset(hashTable, true, sizeof(hashTable)); //初值为true表示所有的键都完好 gets(str); int len = strlen(str); for (int i = 0; i < len; i++) { if (str[i] >= 'A' && str[i] <= 'Z') { str[i] = str[i] - 'A' + 'a'; //如果是大写字母,则转化为小写字母 } hashTable[str[i]] = false; //设置键str[i]失效 } gets(str); len = strlen(str); for (int i = 0; i < len; i++) { if (str[i] >= 'A' && str[i] <= 'Z') { int low = str[i] - 'A' + 'a'; //如果是大写字母,则化为小写字母 if (hashTable[low] == true && hashTable['+'] == true) { printf("%c", str[i]); //只有小写字母的键位与上档键均完好,才进行输出 } } else if (hashTable[str[i]] == true) { printf("%c", str[i]); //对于其他字符,只要键位完好,即输出 } } return 0; }