【算法学习记录-散列】【PAT B1033】旧键盘打字
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入格式:
输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 1 个字符的串。可用的字符包括字母 [a-z, A-Z]、数字 0-9、以及下划线 _(代表空格)、,、.、-、+(代表上档键)。题目保证第 2 行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出格式:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
输入样例:
7+IE.
7_This_is_a_test.
输出样例:
_hs_s_a_tst
思路:
0、与A1084/B1029比较相似的题目,那题是找坏掉的键,这题是给出坏键算出实际输出的字符串
1、整体思路
使用散列表hashTable[]记录坏键,初始化为全true(字符的ASCII码对应下标,按键的好坏用true和false表示)
遍历第一行字符串,将hashTable中对应下标的元素值设为false
遍历第二行字符串
①A-Z的字符,若‘+’完好且对应hashTable中的元素值为true,则输出
②A-Z以外的字符,若对应hashTable中的元素值为true,则输出
2、细节处理
①第一行字符串为空(注意:题目只保证了第二行字符串不为空!)
在A1084/B1029中,对于两行字符串的输入都使用了cin>>,而这个方法是无法读取空字符串的,因此改用getline()
注:这同时也是PintiA的5个测试点中的第3个测试点
②一个容易漏的点(注:同时也是PintiA的5个测试点中的第4、5个测试点)
与‘A’、‘Z’比较时应用>=而非>
3、题解代码
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 int main() { 7 8 string str1; 9 char str2[100010]; 10 getline(cin, str1); 11 cin>>str2; 12 int len1 = str1.length(); 13 int len2 = strlen(str2); 14 15 bool hashTable[128]; 16 for (int i = 0; i < 128; i++) { 17 hashTable[i] = true; 18 } 19 20 char c1, c2; 21 22 for (int i = 0; i < len1; i++) { 23 c1 = str1[i]; 24 hashTable[c1] = false; 25 if (c1 >= 'A' && c1 <= 'Z') { 26 hashTable[c1 + 32] = false; 27 } 28 } 29 30 for (int j = 0; j < len2; j++) { 31 c2 = str2[j]; 32 if (c2 >= 'A' && c2 <= 'Z') { 33 if (hashTable['+'] == true && hashTable[c2] == true) { 34 printf("%c", c2); 35 } 36 } else { 37 if (hashTable[c2] == true) { 38 printf("%c", c2); 39 } 40 } 41 } 42 return 0; 43 }
浙公网安备 33010602011771号