【算法学习记录-散列】【PAT B1033】旧键盘打字

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

输入格式:

输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 1 个字符的串。可用的字符包括字母 [a-zA-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 }

 

posted @ 2021-01-24 15:33  CheapTrick  阅读(85)  评论(0)    收藏  举报