题目与B1029类似 但是略有区别 略微有坑 稍微想了一会儿特殊情况 在pat中有些题目一定要考虑周全 把所有的情况都考虑在内即可!
题目大意:
第一行是坏的按键 即输入这些字符是不显示的,其中‘+’是上档键 就是切换大写字母的,如果加号键坏掉了 那么就不可以打印出大写字母。
第二行是预期输入的字符串,要求输出实际上输出的字符串。
题目的坑点:也就是第三个测试点(应该是),其中需要考虑的是如果第一行没有的话 也就是说没有任何的字符或者是键盘的按键坏了 那么第一行是直接的空行。
本人一直喜欢用cin 然而cin的输入时不吃回车的。因此就需要用getline来输入第一行。
这里还需要提醒自己或者同学注意的是 getline是获取一行,并且是以回车为结束标志的输入。 一个情况是如果上面用了cin作为输入,如果在接下来需要用到getline来输入,那么需要在之前先用getline来吃掉cin之后的回车,不然直接在cin之后的getline只会吃到回车,不会获取到预期的字符串。
例如下列代码:
#include<iostream>
using namespace std;
int main(){
string a,b;
cin>>a;
getline(cin,b);
cout<<a<<"1111"<<b;
}
该程序运行之后得到的结果如图所示
解题代码如下:
/*
cin之后的回车是被忽略的 如果在cin之后使用getline
cin之后的回车就会被getline给吃掉
*/
#include<iostream>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<map>
#include<cstring>
using namespace std;
char input[100005];
int main(){
string ban;
getline(cin,ban);
cin>>input;
int a2n,m[150];
memset(m,-1,150*sizeof(int));
for(int i=0;ban[i]!='\0';i++){
if(ban[i]=='+'){
for(int j=65;j<91;j++)
m[j]=0;
}
else{
a2n=(int)ban[i];
m[a2n]=0;
if(a2n<91&&a2n>64)
m[a2n+32]=0;
}
}
int flag=0;
for(int i=0;input[i]!='\0';i++){
a2n=(int)input[i];
if(m[a2n]==-1){
flag=1;
cout<<input[i];
}
}
if(flag==0)
cout<<endl;
}
/*
+ 43
, 44
- 45
. 46
7+IE.
7_This_is_a_test.
*/