1033 旧键盘打字

1033 旧键盘打字

题目:

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

输入格式:

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

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

输出格式:

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

输入样例:

7+IE.
7_This_is_a_test.

输出样例:

_hs_s_a_tst

代码:

#include<iostream>
#include<string.h>
#include<string>
#define MAX 100000
using namespace std;

int main() {
	//string bad;
	string s;
	char bad[MAX];
	char c;
	int i;
	for (i = 0; (c = getchar()) != '\n'; i++) {
		bad[i] = c;
	}

	cin  >> s;
	int bad_len =i;
	//这个对本题没有用
	//if (bad_len == 0) {
	//	cout << s;
	//	return 0;
	//}
	int s_len = s.length();
	int  j;
	int flag = 0;//用来标记里面是否有+,即上档键
	for (i = 0; i < bad_len; i++) {
		if (bad[i] == '+') {
			flag = 1;
			break;
		}
	}
	
	int num = 0;//用来标记这个字符是否可以打印出来
	int a = 0;//用来记录是否有输出
	//所有的大写都打不出来
	if (flag == 1) {
		//把坏键都转化为小写
		for (i = 0; i < bad_len; i++) {
			if (bad[i]>='A'&&bad[i]<='Z') {
				bad[i] = bad[i] + ('a'-'A');
			}
		}
		for (j = 0; j < s_len; j++) {
			num = 0;
			if (s[j] >= 'A'&&s[j] <= 'Z') {
				num = 1;
				continue;
			}
			else {
				for (i = 0; i < bad_len; i++) {
					if (s[j] == bad[i]) {
						num = 1;
						break;
					}
				}
			}
			if (num == 0)
				cout << s[j];
		}
	}
	//大写可以打出来
	else {
		//把坏键都转化为大写
		//注意这种string的末尾增加一个字符的方式
		for (i = 0; i < bad_len; i++) {
			if (bad[i] >= 'A'&&bad[i] <= 'Z') {
				bad[bad_len++]= 'a' - 'A' + bad[i];
			/*	这种是string的写法
			   char c = 'a' - 'A' + bad[i];
				bad=bad+c;
				bad_len++;*/
			}
		}
		//cout << bad;
		for (j = 0; j < s_len; j++) {
			num = 0;
			for (i = 0; i < bad_len; i++) {
				if (s[j] == bad[i]) {
					num = 1;
					break;
				}
			}
			if (num == 0)
			{
				cout << s[j];
				a++;
			}
		}
	}
	//如果没有一个字符能被打出,则输出空行。
	if (a == 0)
		cout << "\n";
	return 0;
}


//注意考虑俩种特殊情况:
//①如果没有一个字符能被打出,则输出空行。
//②坏键为空。
//题目保证第 2 行输入的文字串非空,但没保证第1行输入的文字串非空,因此若第1行输入为空时要有相应的处理,否则将导致测试点2不通过。

注意:

考虑俩种特殊情况:
①如果没有一个字符能被打出,则输出空行。
②坏键为空。
题目保证第 2 行输入的文字串非空,但没保证第1行输入的文字串非空,因此若第1行输入为空时要有相应的处理,否则将导致测试点3不通过。

若第1行文字串的输入用如下形式:

scanf("%s",str);

或者下面这种:

string str;

则当第1行为空时,由于%s不能读入回车,其会跳过第1行直接将第2行的内容读入str[]。此处我们可采用如下方式来读入,这样第1行为空时也不会影响到下一行,当然还有很多其它方式。

for(int i = 0; (c = getchar()) != '\n'; i++){
    str[i] = c;
}

主要要考虑到这些特殊的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值