PAT-B 真题- 1029. 旧键盘

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

题干:

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。

输入格式:

输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括大、小写)、数字0-9、以及下划线"_"(代表空格)组成。题目保证2个字符串均非空。

输出格式:

按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有1个坏键。

输入样例:

7_This_is_a_test
_hs_s_a_es

输出样例:

7TI

这道题主要考察字符串的操作,这里我用c++的string来做。要注意的是字符串记得转成大写,还有就是不要重复查找。

#include <iostream>
#include <string>

using namespace std;

char uper(char c){
    if(c >= 97 && c <= 122)
    c -= 32;
    return c;
}

int main() {
  string a, b, tmp = "";
  cin>>a>>b;
  for(int i = 0; i < a.size(); i++)
    a[i] = uper(a[i]);
  for(int i = 0; i < b.size(); i++)
    b[i] = uper(b[i]);
  for(int i = 0; i < a.size(); i++){
    if(b.find(a[i]) == string::npos){
      if(tmp.find(a[i]) == string::npos){
        cout<<a[i];
      tmp += a[i];
      }
    }
  }
  return 0;
}

完美通过。这里附上之前一个错误的代码:

//这个是错误的代码!!!
//This is cuowu de code!!!
#include <iostream>
#include <string>

using namespace std;

string delstr(string str, char word){
  string::iterator it = str.begin();
  int i = str.find(word);
  do{
    str.erase(it + i);
    i = str.find(word);
  }while(i!= string::npos);
  return str;
}

char uper(char c)
{
    if(c >= 97 && c <= 122)
    c -= 32;
    return c;
}

int main() {
  string a, b;
  cin>>a>>b;
  for(int i = 0; i < a.size(); i++)
    a[i] = uper(a[i]);
  for(int i = 0; i < b.size(); i++)
    b[i] = uper(b[i]);
  for(int i = 0; i < a.size(); i++){
    if(b.find(a[i]) == string::npos){
      cout<<a[i];
      a = delstr(a, a[i]);
    }
  }
  return 0;
}

错误之处在于防止重复查找,我直接删除了原来字符串中的所有查找到的元素,导致下标错位,造成漏找。用临时变量存储已找到的元素即可。

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