Leetcode1160,在这个题里用全局变量是我心中永远的痛

题目链接,Leetcode1160

心痛的提交过程

你能感受那种,自己在测代码OK的,但是一提交就错的心痛感吗?
Leetcode1160,在这个题里用全局变量是我心中永远的痛_第1张图片

绝望中的猜想,迎来胜利的曙光

是不是每次执行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不用全局变量!!!

你可能感兴趣的:(入门级刷题)