提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
从零开始刷leetcode,第二题383.赎金信
一、第一次出错
大体思路除了稍显繁琐之外,还有些问题。
1.memset函数的应用
memset(ary,num,sizeof());
sizeof()指变量和数据类型的字节大小,一个int型占4个字节,在memset函数里只填一个26是不正确的,可以填26*4或者sizeof(aryR)。
2.数组应该选择一个即可,可采用加减的方式,判断这个数组中是否有小于零的数来判断magazine中是否有足够的字符构成ransomNote中的字符。
3.最后判断是否能够构成的时候,不必在break之后再额外判断一次能否构成,可以在条件触发时,直接返回false。
bool canConstruct(char * ransomNote, char * magazine){
int aryR[26];
int aryM[26];
memset(aryR,0,26);
memset(aryM,0,26);
int i = 0;
int x;
while(ransomNote[i] != '\0'){
x = ransomNote[i] - 'a';
aryR[x]++;
i++;
}
i = 0;
while(magazine[i] != '\0'){
x = magazine[i] - 'a';
aryM[x]++;
i++;
}
i = 0;
while(aryR[i] != '\0'){
if(aryM[i] < aryR[i])
break;
i++;
}
if(i<26)
return false;
return true;
}
二、正确代码
size strlen(const char str);
返回一个字符串的长度。
bool canConstruct(char * ransomNote, char * magazine){
int aryR[26];
memset(aryR, 0, sizeof(aryR));
int i;
for(i=0; i<strlen(magazine); i++){
aryR[magazine[i] - 'a']++;
}
for(i=0; i<strlen(ransomNote); i++){
aryR[ransomNote[i] - 'a']--;
if(aryR[ransomNote[i] - 'a'] < 0)
return false;
}
return true;
}
总结
无