PAT 乙级 1033 旧键盘打字
原创
©著作权归作者所有:来自51CTO博客作者漫浸天空的雨色的原创作品,请联系作者获取转载授权,否则将追究法律责任
1033 旧键盘打字 (20 point(s))
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入格式:
输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 10^5 个字符的串。可用的字符包括字母 [a
-z
, A
-Z
]、数字 0
-9
、以及下划线 _
(代表空格)、,
、.
、-
、+
(代表上档键)。题目保证第 2 行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出格式:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
输入样例:
输出样例:
经验总结:
这一题,思路上没有难度,主要有一个坑点,就是输入的串有可能是空串,用gets()函数可以解决,但是在PAT的C++环境里编译无法通过,所以可以考虑使用string里面的getline()函数,当然,也可以考虑使用cin.getline()函数,总之,不能用scanf()函数,因为debug时发现,如果scanf()读入的第一个就是'\n',那么它会跳过这个符号往后读一个,如果后面还是'\n',它还会继续跳过,直到遇见第一个非空格也非换行符的字符才开始读入,而getline()遇到'\n'会直接终止,读入为空则为空串。
AC代码
基础方法:
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
const int maxn=100010;
int main()
{
char t[maxn],s[maxn];
string temp;
bool f[256]={false};
while(cin.getline(t,maxn))
{
cin.getline(s,maxn);
for(int i=0;t[i]!='\0';++i)
{
if(t[i]>=65&&t[i]<=90)
{
f[t[i]]=true;
f[t[i]+32]=true;
}
else
f[t[i]]=true;
}
for(int i=0;s[i]!='\0';++i)
{
if(s[i]>=65&&s[i]<=90)
{
if(f['+']==false&&f[s[i]]==false)
printf("%c",s[i]);
}
else
{
if(f[s[i]]==false)
printf("%c",s[i]);
}
}
printf("\n");
}
return 0;
}
string函数方法:
#include <string>
#include <iostream>
using namespace std;
int main()
{
string s1;
char c;
getline(cin,s1);
while((c=getchar())!='\n')
if(s1.find(toupper(c))==string::npos&&(s1.find('+')==string::npos||!isupper(c)))
cout<<c;
return 0;
}