https://pintia.cn/problem-sets/994805260223102976/problems/994805288530460672
测试点2考察第1行输入的空白字符串。题目保证第2行输入的文字串非空。
,不保证第1行。
从别人哪里看的,太坑了。getline允许string为空,而cin不允许
#include <iostream> using namespace std; int temp[128]={0}; int main() { string bad,input; // cin>>bad>>input;不正确 getline(cin,bad); getline(cin,input); bool flag=false; for(int i=0;i<bad.size();i++){ if(bad[i] == '+') flag = true; //对应英文字母的坏键以大写给出 if(bad[i]>='A'&&bad[i]<='Z') temp[bad[i]+('a'-'A')]++; temp[bad[i]]++; } for (int i = 0; i < input.size(); i++) { if(temp[input[i]]==0){ if(flag&&input[i]>='A'&&input[i]<='Z')//不输出大写 continue; else cout <<input[i]; } } return 0; }
柳大佬的代码
学到:
npos可以表示string的结束位子,是string::type_size 类型的,也就是find()返回的类型。
find函数在找不到指定值得情况下会返回string::npos。
int toupper(int c) 把小写字母转换为大写字母。
int isupper(int c) 检查所传的字符是否是大写字母。
#include <iostream> #include <cctype> 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; }