【PAT (Basic Level) Practice】P1033 旧键盘打字 (20 分) 速解
题目:
1033 旧键盘打字 (20 分)
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入格式:
输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 105 个字符的串。可用的字符包括字母 [
a
-z
,A
-Z
]、数字0
-9
、以及下划线_
(代表空格)、,
、.
、-
、+
(代表上档键)。题目保证第 2 行输入的文字串非空。注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出格式:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
输入样例:
7+IE. 7_This_is_a_test.输出样例:
_hs_s_a_tst
题目分析:
题目目标:输出字符串2中可输出的字符
思路:标记坏键,遍历字符串2
问题:如何标记
特殊标记法(速解):
已知char型数据可转换成int型数据,int型数据可作为有效数组下标。
故char型数据可直接作为数组下标,范围0-255;
代码:
#include<iostream> using namespace std; void solve(char str1[], char str2[]); int main() { char str1[100001], str2[100001]; cin.getline(str1, 100001); cin.getline(str2, 100001); solve(str1, str2); return 0; } void solve(char str1[], char str2[]) { //初始化标记数组 int Mark[300] = { 0 }; //标记坏键 for (int i = 0; str1[i] != '\0'; i++) { Mark[str1[i]] = 1; if (str1[i] >= 'A' && str1[i] <= 'Z') Mark[str1[i] - 'A' + 'a'] = 1;//标记小写 } //若上档键坏了,标记所有大写 if (Mark['+'] == 1) for (int i = 'A'; i <= 'Z'; i++) Mark[i] = 1; //遍历字符串2 for (int i = 0; str2[i] != '\0'; i++) if (Mark[str2[i]] == 0) cout << str2[i]; }