PAT Basic Level 1033 旧键盘打字 解题思路及AC代码

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值