PAT-B 真题- 1033. 旧键盘打字

发布于 / PAT-乙级 / 0 条评论

原题干:

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

输入格式:

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

注意:如果上档键坏掉了,那么大写的英文字母无法被打出。

输出格式:

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

输入样例:

7+IE.
7_This_is_a_test.

输出样例:

_hs_s_a_tst

首先千万记住这些。。。。血的教训。。

这里要注意这么几点:首先小写转大写的时候注意判断不要出错,一般用char型的字符+32,即可转换成小写。但是这样会有一个小小的弊病,例如'k'+32 = '+'。


所以我们小写转大写或者判断的时候要特别注意这一点。

还有一点需要注意的就是题目并没有说第一行不为空,如果第一行为空就不能用cin进行读取了。(亲测有一个测试点是第一行为空的)。这里我们用getline(cin,[variable])来读取一整行字符串。

上代码:

#include <iostream>
#include <cstdio>
#include <string>

using namespace std;

bool isUper(char s) {
  return ((s >= 'A') && (s <= 'Z'));
}

string killShift(string str) {
  string result = "";
  for(int i = 0; i < str.length(); i++) {
    if(!isUper(str[i]))
      result += str[i];
  }
  return result;
}

char lower(char s) {
  if(isUper(s))
    return (char)(s + 32);
  else return s;
}

string killLetter(string str, char s) {
  string result;
  for(int i = 0; i < str.length(); i++) {
    if((str[i] != s) && (str[i] != lower(s)))
      result += str[i];
  }
  return result;
}

int main() {
  string str, broken;
  getline(cin, broken);  //为了防止第一行是空的
  getline(cin, str);
  if(broken.find('+') != string::npos) {
    str = killShift(str);
    broken = killLetter(broken, '+');
  }
  for(int i = 0; i < broken.length(); i++) {
    str = killLetter(str, broken[i]);
  }
  cout << str;
  if(str == "")
    cout<<endl;

  return 0;
}

转载原创文章请注明,转载自: 斐斐のBlog » PAT-B 真题- 1033. 旧键盘打字
目前还没有评论,快来抢沙发吧~