看题目得到的大概思路:题目告诉我们有两个字符串且相差一个字符,然后求得相差的那一个字符。所以我会直接想到用 hash 表的方法来解决这个问题。记录其中一个字符串中每个字符在该字符串中出现的次数,然后记录另外一个字符串中的每个字符在该字符串中出现的次数。最后,用相同字符在两个字符串中出现的次数相减,如果相减值不等于0,则该字符就是多余的那一个字符。
如果不知道我上面提到的hash法,那我简单解释一下:hash法是一种用空间换取时间的方法,可以通过自己定义的关键值查找对应元素而且hash法查找的时间复杂度是O(1),所以此方法多用于查找。但是hashb法的使用范围非常广泛,因此对于不同的问题要抽象出来并且确定关键值。有于本题说明了是两个字符串,通过已经学过的知识知道英文字符的ASCALL码值在区间 [65,122]。所以,我们可以定义一个整形数组hash来存储同一个字符出现的次数,同时把字符的码值作为关键值及数组下标。至此,一个简单的hash表就完成了;
1.定义一个数组hash,字符串str1和str2:str1和str2用来输入元素,hash来存储同一个元素出现的次数,数组下标 i 表示某个字符的码值,例如i=65表示字符A,i=66表示字符B,i=97表示字符a......i=122表示字符z,因此我们要定义一个能存入130个元素的数组;而数组元素表示某个字符出现的次数,i=65时,hash[i]=2表示i所对应的字符A有2个(在字符串中出现的次数),i=122时,hash[i]=3表示对应字符z有3个。
2.遍历其中一个字符串(str1为例):遍历每个字符且以字符码值为下标的数组hash中的值加一。例如str=“AbZ”,当 i 指向 A ,把 A 的码值作为 hash 数组的下标,那么 hash[str[i]]++就是字符A目前出现的次数;遍历完后就能得到字符串中每个元素出现的次数。
3.遍历另外一个字符串(str2为例):遍历每个字符且以字符码值为下标的数组hash中的值减一,言外之意是把当前字符串的每个元素出现次数与前一个字符串的每个元素出现次数做一个抵消。
3.遍历hash数组,如果 hash[i] 的值为0,则说明 i 值对应的字符不是多的那一个字符;否则,i 值对应的字符就是多的那个字符,直接输出并break (可能第一个字符就是多的那个字符,就不需要再往后遍历数组 hash)
如上都是我做此题的心得和想法,如果有无,请不吝指正!!!
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
// 请在此输入您的代码
int hash[130]={0}; //记录相同字符出现的次数
char str1[101],str2[101]; //需要输入得两个字符串
scanf("%s",str1);
scanf("%s",str2);
for(int i=0;i<strlen(str1);i++)//将字符串str1的字符存入数组 hash
{
hash[str1[i]]++;//记录相同字符出现的次数
}
for(int i=0;i<strlen(str2);i++)//查看字符串str2中的字符是否在str1中存在
{
hash[str2[i]]--;//数组hash中记录的次数减减
}
for(int i=0;i<130;i++)//遍历hash数组,如果数值不为0,则该下标对应字符为相差字符
{
if(hash[i]!=0)
{
printf("%c",i);
break;
}
}
return 0;
}