PAT乙级----1033 旧键盘打字

1. 题目

PAT乙级----1033 旧键盘打字_第1张图片

2.代码

自己写的渣渣代码

#include 
#include 
using namespace std;

int main()
{
	int flag = 1;	//作为判断是否上档键坏掉的标记
	string s1, s2;
	getline(cin,s1);
    getline(cin,s2);

	if (s1.find('+') != string::npos)
		flag = 0;
	
	for (int i = 0; i < s2.size(); i++) {
		if (s2[i] >= '0' && s2[i] <= '9' && s1.find(s2[i]) == string::npos) {	//先判断数字	
			cout << s2[i];
			continue;
		}
		
		if (isalpha(s2[i]) && s1.find(toupper(s2[i])) == string::npos) {	//判断字母
			if (flag) {	
				cout << s2[i];
				continue;
			}
			else {
				if (!isupper(s2[i])) {
					cout << s2[i];
					continue;
				}
			}
		}

		if (s1.find(s2[i]) == string::npos && (s2[i] == '_' || s2[i] == '.' || s2[i] == '-' || s2[i] == ',') ) {	//判断特殊符号
			cout << s2[i];
			continue;
		}
	}

	return 0;
}

柳神的代码(对比一下怀疑自己的IQ)

#include 
#include 
using namespace std;

int main() {
	string bad, should;
	getline(cin, bad);
	getline(cin, should);
	
	for (int i = 0, length = should.length(); i < length; i++) {
		if (bad.find(toupper(should[i])) != string::npos) continue;	//先直接判断有没有和坏键相同的字母
		if (isupper(should[i]) && bad.find('+') != string::npos) continue;	//再判断是不是大写字母且上档键有没有坏
		cout << should[i];	//如果上面判断都失败则可以输出该字符
	}
	
	return 0;
}

3. 分析

  • 题目中说了保证第二行输出的字符串非空,但是没有保证第一行不为空(也就是没有坏键),因此这里的输入我们要用getline函数,不可以用cin
  • string 中的find函数的运用 当find函数没有任何发现的时候返回一个npos
  • 改进的代码中对数字和字母都直接使用toupper.这一点可以学习

你可能感兴趣的:(PAT乙级)