题目
思路
我的想法是遍历s1,通过find函数,在s2中找s1[i]的每一位,找不到的即为坏的键盘,进行输出。但测试点4一直错误。
实在找不出原因。只好换算法笔记的做法,遍历s2与s1【i】比较。
测试点4未通过代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
string s1,s2;
getline(cin,s1);
getline(cin,s2);
int len1=s1.length();
int len2=s2.length();
bool zimu[24]={0};
bool shuzi[10]={0};
bool kong=0;
for(int i=0;i<len1;i++){
if(s2.find(s1[i])==-1){
if(s1[i]>='A'&&s1[i]<='Z'&&zimu[s1[i]-'A']==0){
zimu[s1[i]-'A']=1;
cout<<s1[i];
}
else if(s1[i]>='a'&&s1[i]<='z'&&zimu[s1[i]-'a']==0){
zimu[s1[i]-'a']=1;
char c=s1[i]-32;
cout<<c;
}
else if(s1[i]>='0'&&s1[i]<='9'&&shuzi[s1[i]-'0']==0){
shuzi[s1[i]-'0']=1;
cout<<s1[i];
}
else if(s1[i]=='_' && kong==0){
cout<<'_';
kong=1;
}
} }
}
AC代码
#include<bits/stdc++.h>
using namespace std;
int main(){
string a,b;
bool hashtable[1000]={false};
getline(cin,a);getline(cin,b);
int len1=a.length() , len2=b.length();
for(int i=0;i<len1;i++){
int j;
char c1,c2;
for(j=0;j<len2;j++){
c1=a[i];//将第一个字符数组的每一个,用第二个字符数组遍历;
c2=b[j];//将第一个字符数组的每一个,用第二个字符数组遍历;
if(c1>='a'&&c1<='z') c1-=32;//换大写
if(c2>='a'&&c2<='z') c2-=32;
if(c1==c2) break; //有相同的跳出循环
}
if(j==len2&&hashtable[c1]==false){//两字符串没有相同的《》等价于遍历后j=len2。用hashtable记录已输出过的字母。
cout<<c1;
hashtable[c1]=true;
}
}
return 0;
}