PAT-B1033-Broken Keyboard

PAT Broken Keyboard - 题目链接


题目描述

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

输入描述

 输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 10 e5个字符的串。可用的字符包括字母 [a-z, A-Z]、数字 0-9、以及下划线 _(代表空格)、,、.、-、+(代表上档键)。题目保证第 2 行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。

输出描述

 在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。


示例:

输入

7+IE.
7_This_is_a_test.

输出

_hs_s_a_tst


解题思路

 首先读取坏掉的按键的字符串,将大写字母转换为小写字母(如果小写转大写会很麻烦在后面的判断),读取到的字符在HashTable中变为false,表示该按键不能使用;
 之后读取输入的字符串,遍历改字符串,判断是否能够使用,如果遇到的是大写字母,就就判断换挡键“+”和对应的字母按键是否能够使用,两者同时满足才要打印出来,如果是其他字符只需要判断改按键是否损坏(大大写转小写的好处),不损坏就打印出来;
 这里在测试点2一直报错,是因为忽略的题目的第一行可能是个空行,也就是没有按键损坏的情况,scanf遇到刚开始就是换行的会忽略这个换行,只有在输入了数据之后的下一个换行才是结束的标志。这里可以直接使用gets或者c++版本的getline(cin,str),比较建议后者,因为PAT的c++编译器不支持gets,处理起来比较繁琐。

参考代码

#include<iostream>
#include<cstring>

using namespace std;
bool HashTable[256];

int main() {
    string str;
    memset(HashTable, true, sizeof(HashTable)); //初始化按键全部可以使用
    getline(cin, str);//这里是数据读取的重点
    for (int i = 0; i < str.length(); ++i) {
        if (str[i] >= 'A' && str[i] <= 'Z') {
            str[i] += 32; //大写转为小写
        }
        HashTable[str[i]] = false;//false说明按键坏了
    }
    getline(cin, str);
    for (int j = 0; j < str.length(); ++j) {
        if (str[j] >= 'A' && str[j] <= 'Z') {
            char temp = str[j] + 32; //先转为小写判断按键
            if (HashTable[temp] == true && HashTable['+'] == true) {
                printf("%c", str[j]);
            }
        } else if (HashTable[str[j]] == true) {//如果是小写转大写还需要在这里再次分类判断
            printf("%c", str[j]);
        }
    }
    printf("\n");
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值