1033. 旧键盘打字
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入格式:
输入在2行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过105个字符的串。可用的字符包括字母[a-z, A-Z]、数字0-9、以及下划线“_”(代表空格)、“,”、“.”、“-”、“+”(代表上档键)。题目保证第2行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出格式:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
输入样例:7+IE. 7_This_is_a_test.输出样例:
_hs_s_a_tst
首先感觉这道题对于我来说有两个难点。
1、如何快速的访问已坏掉的键,不使用字符串的遍历
2、在解决第一个问题后,依旧运行超时
解决问题1 :
使用set集合,用来存储不重复的数据,(map 一个结点有两个数据,分别为key和数据,set中只有数据)
也可以用数组+数组下标来实现set的功能,但要注意初始化为0
解决问题2:
原代码中我使用gets来读取字符串,发现运行超时,所以采用一个一个字符读取的方法
即:while(scanf(“%c”,&ch))!=EOF;
网上也看到有人用String来保存字符串,也没有超时。可见String对字符串的处理要高效的多。所以以后尽量都用String
最后注意题目输入为空的情况,使用gets()或getline(cin,x)(String)
版本1:
#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
int main()
{
//printf("%d",'z'); //32“,”、“.”、“-”、
char brokenK[100005];
//char input[100001];
int broken[300];
int TopKey=1,ifprint=1;
int a,b,i,key,ifkeyprint=1;
for(i=0;i<256;i++)
{
broken[i]=0;
}
gets(brokenK);
// cin>>input;
//gets(input);
//cout<<strlen(input);
for(a=0;a<strlen(brokenK);a++)
{
if(brokenK[a]=='+')
{
TopKey=0;
}
else if( brokenK[a]>='A'&&brokenK[a]<='Z')
{
broken[brokenK[a]]=1;
broken[brokenK[a]+32]=1;
}
else
{
broken[brokenK[a]]=1;
}
}
char ch;
while(scanf("%c",&ch) != EOF)
{
// printf("%d ",broken[ch]);
if(broken[ch]==0)
{
if(ch>='A'&&ch<='Z')
{
if(TopKey)
{
cout<<ch;
}
}
else
{
cout<<ch;
}
}
// printf("\n");
}
return 0;
}
版本2:(String) 参考:http://blog.csdn.net/bbbbaai/article/details/46537307
int main()
{
//freopen("d://1.txt", "r", stdin);
//freopen("d://2.txt", "w", stdout);
string n, m;
//while (cin >> n >> m)
//{
while (getline(cin, n))//用getline才能确保每行读进去
{
getline(cin, m);
if (n.length() == 0 || n.empty())//脑残啊,第一行为空,所有的键都是好的,就直接输出就好了。
{
cout << m << endl;
continue;
}
bool up = false;
set<char> broken;
for (int i = 0; i < n.length(); i++)
{
if (n[i] == '+')
{
up = true;//坏了
//broken.insert(n[i]);//+自身也是一个字符,注意去除掉,还以为是这个点。结果不是
}
else
{
if (n[i] >= 'A'&&n[i] <= 'Z')
{
broken.insert(n[i]);
broken.insert(n[i] - 'A' + 'a');
}
else if (n[i] >= 'a'&&n[i] <= 'z')
{
broken.insert(n[i]);
broken.insert(n[i] - 'a' + 'A');
}
else
{
broken.insert(n[i]);
}
}
}
for (int i = 0; i < m.length(); i++)
{
if (broken.count(m[i]) == 0)
{
if (m[i] >= 'A'&&m[i] <= 'Z'&&up)
{
/*char temp = m[i] - 'A' + 'a';
cout << temp;*/
continue;
}
else
{
cout << m[i];
}
}
}
cout << endl;
}
return 0;
}