旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。
输入格式:
输入在 2 行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过 80 个字符的串,由字母 A-Z(包括大、小写)、数字 0-9、以及下划线 _(代表空格)组成。题目保证 2 个字符串均非空。
输出格式:
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有 1 个坏键。
输入样例:
7_This_is_a_test
_hs_s_a_es
输出样例:
7TI
1、理解题意
给出应该输入的一段文字、以及实际被输入的文字,列出肯定坏掉的那些键,按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。
2、解题思路
(1)有两个问题需要解决:按顺序输出第一个字符串在第二个字符串中没有的字符,且英文字母均输出大写字母;确保输出的字符没有重复;
(2)定义一个整型数组hashTable,初值设置为0,先依次扫描第二个字符串,将其中的小写字母变成对应的大写字母,并将大写字母转化为数字id,数组hashTable以id为下标的值加1;然后依次扫描第一个字符串中的字符,并将小写字母转化为大写字母,顺便将其转化为数字id,若hashTable[id]==0,则说明这个字母没有在第二个字符串中出现,需要输出,设置记录数组count用来存放目标字符,每当扫描到hashTable[id]==0时,就将对应的字符存放到count数组中,同时将该字符对应的hashTable[id]加1(避免了同字符进入数组count);
(3)依次输出count中的字符。
#include<cstdio>
#include<cstring>
int hashFunc(char c){//将字符转化为数字
int id=0;
for(int i=0;i<63;i++){
if(c>='A'&&c<='Z'){
id=c-'A';
}else if(c>='a'&&c<='z'){
id=c-'a'+26;
}else if(c>='0'&&c<='9'){
id=c-'0'+53;
}else if(c=='_'){
id=63;
}
}
return id;
}
int main(){
char str1[85],str2[85];
scanf("%s %s",str1,str2);
int hashTable[70]={0};
int len1=strlen(str1);
int len2=strlen(str2);
for(int i=0;i<len2;i++){
if(str2[i]>='a'&&str2[i]<='z'){//小写变大写
str2[i]=str2[i]-32;
}
int id=hashFunc(str2[i]);
hashTable[id]++;
}
char count[85];
int j=0;
for(int i=0;i<len1;i++){
if(str1[i]>='a'&&str1[i]<='z'){//小写变大写
str1[i]=str1[i]-32;
}
int id=hashFunc(str1[i]);
if(hashTable[id]==0) {
count[j++]=str1[i];
hashTable[id]++;
}
}
for(int i=0;i<j;i++){
printf("%c",count[i]);
}
return 0;
}
3、总结
1、将字符转化为数字的过程可以直接用
int hashTable[128];
替代。在C语言中,字符常量使用ASCII码统一编码,标准ASCII码的范围是0~127,其中包含了控制字符或通信专用字符和常用的可显示字符。0到9、A到Z、a到z的ASCII码分别为48到57、65到90、97到122,小写字母比大写字母的ASCII码值大32。
2、涉及到字符串比较时,通常可以考虑hash(散列)法。
3、提供几个测试用例:
A_B_C_D
ABCD//正确输出:_
_DF_
_Df_//正确输出:无输出