旧键盘打字(PAT)
题目描述
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入描述:
输入在2行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过10^5个字符的串。可用的字符包括字母[a-z, A-Z]、数字0-9、以及下划线“_”(代表空格)、“,”、“.”、“-”、“+”(代表上档键)。题目保证第2行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出描述:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
输入例子:
7+IE.
7_This_is_a_test.
输出例子:
_hs_s_a_tst
题意:
给定两个字符串,分别为串1和串2。依次输出串2字符,需满足凡在串1中出现的字符,均不能输出。且以‘+’代表上档键,若无上档键则不能输出任何大写字母。
解题思路:
- 定义一个bool型数组,该数组记载坏掉的键。(因为给定字符的ASCII码在0-256之间,故数组大小开为256即可)
- 遍历串1,使用char型字符充当整型下标,统计所有坏掉的键。
- 遍历串2,依照题意规定的输出限制,依次按条件判定是否输出当前遍历字符。
- 输出换行。(题意规定若没有一个字符能被输出,则输出空行。这里题目判定系统没有卡输出数据了还换行的问题,若有的题目明确指出不能输出,则可定义一个bool型变量,记载判定是否输出数据,随后依据该变量取值选择性输出换行符即可)
源代码:
#include <iostream>
#include <string>
using namespace std;
const int N = 256;
bool flag[N]; //记载坏掉的键 - 默认false,true为坏掉键
int main() {
string Str1; //坏键
cin >> Str1;
//遍历,将坏掉的键进行记载
for(int i = 0; i < Str1.size(); i++) {
//字符char为0-128的整型,因此能够直接当作下标
flag[Str1[i]] = true;
}
string Str2; //待输出数据
cin >> Str2;
//遍历string字符串,判断键的好坏并依次输出数据
for(int i = 0; i < Str2.size(); i++) {
//判断类型 - 大写英文字母,需要上档键和对应英文字母键完好
if(Str2[i] >= 'A' && Str2[i] <= 'Z') {
if(!flag['+'] && !flag[Str2[i]]) cout << Str2[i];
}
//小写字母,由于坏键存储只存储大写英文字母,所以小写下标需要转为大写下标
else if(Str2[i] >= 'a' && Str2[i] <= 'z') {
if(!flag[Str2[i]-'a'+'A']) cout << Str2[i];
}
//其他字符,直接通过下标判断键是否存在即可
else if(!flag[Str2[i]]){
cout << Str2[i];
}
}
//若不存在数据,需输出空行
cout << endl;
return 0;
}
该博客讨论了一道编程题目,涉及旧键盘上某些键位损坏导致无法正常输入的问题。题目要求根据给定的坏键和应输入的文字,预测实际能打出的文本。解题策略包括创建一个布尔数组记录坏键,遍历输入字符串并根据键的状态决定是否输出字符。源代码使用C++实现,考虑了大写字母需借助上档键的情况。
3175

被折叠的 条评论
为什么被折叠?



