PAT 乙级 1033 旧键盘打字 v1.0
1. 题目简述及在线测试位置
1.1 已知键盘上损坏的键位 和 需要打印的字符串,输出实际打印的字符串
1.2 在线测试位置:PAT 1033 旧键盘打字
2. 基本思路
2.0 使用散列的解题思路会事半功倍
2.1 无论字母、数字还是符号,他们存储的本质还是ASCII码。新建布尔数组,数组下标对应 键盘上的按键(ASCII码),元素值对应 键位是否缺失
2.2 对于键盘上的缺失键位( 字母 数字 或 符号),将布尔数组中对应元素的元素值置为false(通过对应ASCII码确定数组下标)
2.3 对于录入的文字,按Hash的思想,将每一个字符按其ASCII码存储到布尔数组中,若对应的数组元素值为Fasle,不进行输入打印,若为True,则进行打印
2.4 有两点还需注意:(1)录入的字符串中可能包含 空格,因此使用 getline() 函数(2)+ 代表上档键 、_ 代表空格键,需要特别处理
3. 完整AC代码
#include <iostream>
#include <string> //通过 getline() 录入包含空格的字符
using namespace std;
#define MAX 128
#define Value ('a'-'A')
int main()
{
bool Mark[MAX]; //Mark数组对应键盘上的按键(ASCII码)
string LackKey, InputInfo; //缺失的字符 输入字符
for (int i = 0; i < MAX; i++) //键盘默认全键
Mark[i] = true;
getline(cin, LackKey); //LackKey 标记出缺失的键位 // _ 代表空格 , + 代表上档键
for (int i = 0; i < LackKey.length(); i++)
{
if (LackKey[i] >= 'A' && LackKey[i] <= 'Z')//若缺失A,意味着 a A均无法输入
{
Mark[LackKey[i]] = false;
Mark[LackKey[i] + Value] = false;
}
else
Mark[LackKey[i]] = false;
}
getline(cin, InputInfo); //输入的字符串包含空格,所以用getline(). 两个string都使用getline()输入,避免前后输入方式不一致引起冲突
for (int i = 0; i < InputInfo.length(); i++)
{
if (!Mark[InputInfo[i]]) //输入字符对应缺失键位
continue;
if (!Mark['+'] && InputInfo[i] >= 'A' && InputInfo[i] <= 'Z')//无法大写
continue;
if (!Mark['_'] && InputInfo[i] == ' ') //无法打印空格
continue;
cout << InputInfo[i];
}
return 0;
}