题目链接,Leetcode1160
心痛的提交过程
你能感受那种,自己在测代码OK的,但是一提交就错的心痛感吗?
绝望中的猜想,迎来胜利的曙光
是不是每次执行solution的时候,并没有清空Alph呢?
一试,果然如此。
//以下是错误解法,错在将Alph定义为全局变量
int Alph[26];
int isJizhu(char ** words, int index){
int res = 1;
int beta[26] = {0};
for(int i=0;i<26;i++){
beta[i] = 0;
}
for(int i=0;i<strlen(words[index]);i++){
beta[words[index][i] - 'a']++;
}
for(int i=0;i<26;i++){
if(beta[i]>Alph[i]){
res = 0;break;
}
}
return res;
}
int countCharacters(char ** words, int wordsSize, char * chars){
if(strlen(chars)==0) return 0;
if(wordsSize==0) return 0;
int ans;
ans = 0;
for(int i=0;i<strlen(chars);i++){
Alph[chars[i]-'a']++;
}
for(int i=0;i<wordsSize;i++){
if(isJizhu(words, i) == 1){
ans = ans + strlen(words[i]);
}
}
return ans;
}
将Alph改成局部变量就OK了
//正解
int isJizhu(char ** words, int index, int * Alph){
int res = 1;
int beta[26] = {0};
for(int i=0;i<26;i++){
beta[i] = 0;
}
for(int i=0;i<strlen(words[index]);i++){
beta[words[index][i] - 'a']++;
}
for(int i=0;i<26;i++){
if(beta[i]>Alph[i]){
res = 0;break;
}
}
return res;
}
int countCharacters(char ** words, int wordsSize, char * chars){
if(strlen(chars)==0) return 0;
if(wordsSize==0) return 0;
int Alph[26];
for(int i=0;i<26;i++){
Alph[i] = 0;
}
int ans;
ans = 0;
for(int i=0;i<strlen(chars);i++){
Alph[chars[i]-'a']++;
}
for(int i=0;i<wordsSize;i++){
if(isJizhu(words, i, Alph) == 1){
ans = ans + strlen(words[i]);
}
}
return ans;
}
深刻的反思
全局变量这种生命周期自己说了不算的变量,尽量不要为了少写一点初始化代码而偷懒用它了。
这个问题之所以会在leetcode中出现,而在ACM中很少见,是因为,ACM是ACMer自己来处理输入输出的,所以整个测试过程是ACMer自己把握的,因此ACMer知道,自己定义的全局变量要不要重新赋值,比如这个题,如果让我写输入输出的code,我就会注意重新对Alph赋值的。
leetcode去掉了初始化的烦恼,好坏参半。
教训
刷leetcode不用全局变量!!!