https://pintia.cn/problem-sets/994805342720868352/problems/994805382902300672
输入格式:
7_This_is_a_test _hs_s_a_es
输出格式:
7TI
【大致思路】
分别读入两个字符串,第一个for循环枚举第一个字符串,内部嵌套的第二个for枚举第二个字符串,如果是小写字母则都转化为大写,若c1在第二个字符串中出现,则跳出内层for循环;内层for循环结束时,如果第二个字符串未出现c1,且c1未被输出过,则输出c1。
对于上面的判断c1是否输出过:hashtable数组元素为false时则代表c1未被输出过;而如果输出c1后则令对应的hashtable[c1]=true。
【2个关键点】
(1)在不分大小写英文下,判断在第一个字符串中出现,但在第二个字符串中没出现的字符。
(2)同一个字符(不区分大小写)在最后均用大写字母输出一次。
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string> #include<algorithm> using namespace std; 注意是两个"有联系"的字符串的比较 另外,可用bool型字数组HashTable[]表示字符是否已经输出 int main(){ string str1,str2; bool HashTable[128]={false}; //HashTable数组用来标记字符是否已被输出 getline(cin,str1); getline(cin,str2); int len1=str1.length(); int len2=str2.length(); for(int i=0;i<len1;i++){ //枚举第一个字符串中的每个字符 int j; char c1,c2; for(j=0;j<len2;j++){ //枚举第二个字符串的每个字符 c1=str1[i]; c2=str2[j]; if(c1 >= 'a' && c1 <= 'z') c1-=32; //如果是小写字母,则转化为大写 if(c2 >= 'a' && c2 <= 'z') c2-=32; //如果是小写字母,则转化为大写 if(c1 == c2) break; //如果c1在第二个字符串中出现,则跳出 } if( j == len2 && HashTable[c1] == false) { printf("%c",c1); //在第二个字符串中未出现c1,且c1未被输出过 HashTable[c1]=true; } } system("pause"); return 0; }
注意点
(1)空格也作为需要判断的字符;
(2)大小写不区分,且小写字母均输出其大写形式;
(3)HashTable数组的大小只要能把题目给出的字符包括即可——一般可直接设置ASCII码的个数128作为数组的长度。