1033 旧键盘打字 (20 分)
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
原题链接
代码
#include<stdlib.h>
#include<set>
#include<cctype>
#include<string>
#include<iostream>
using namespace std;
int main()
{
set<char> st;
string s1, s2;
getline(cin, s1);
getline(cin, s2);
for(int i=0;i<s1.size();i++)
{ if (s1[i] == '+')
for (int j = 'A'; j <= 'Z'; j++)
{
st.insert(j);
}
if (isupper(s1[i]))
st.insert(tolower(s1[i]));
st.insert(s1[i]);
}// st is forbidded letter
for (int i = 0; i < s2.size(); i++)
{
if (st.find(s2[i]) == st.end())//st.end()相当于string::npos,表示找不到
cout << s2[i];
}
cout << endl;
return 0;
}
题解
- 如果第一行输入的是空行,需要使用
getline(cin, s)
,不能用cin >> s
。 - 判断是不是大写字母可以用ctype.h头文件下的
isupper()
方法 - 对于set容器,
st.find()
如果找得到就返回一个对应元素的set迭代器,如果找不到,返回st.end()
- 我自己写的代码测试点3过不了,希望有大佬指正,代码如下:
#include <iostream>
#include <cctype>
#include <string>
using namespace std;
int main() {
string huai, s;
getline(cin, huai);
getline(cin, s);
// cin >> huai >> s; //第一行可能是空的,所以这样写是错误的!
if (huai.find('+') != string::npos) {//上档键坏了,只有小写字母
for (int i = 0; i < s.size(); i++) {//删除大写
if (s[i] >= 'A' && s[i] <= 'Z' || s[i]== '+') {
s.erase(s.begin()+i);
}
}
}
for (int i = 0; i < huai.size(); i++) {
if (huai[i]>= 'A' && huai[i] <= 'Z') {
while (s.find(tolower(huai[i])) != string::npos) {
s.erase(s.begin() + s.find(tolower(huai[i])));//删掉小写字母
}
while (s.find((huai[i])) != string::npos) {
s.erase(s.begin() + s.find((huai[i])));//删掉大写字母
}
}else {//删除剩下所有存在的字符
while (s.find(huai[i]) != string::npos) {
s.erase(s.begin()+ s.find(huai[i]));
}
}
}
cout << s << endl;
return 0;
}