这两个循环在C++有什么区别

What is the difference between these two loops in C++?

本文关键字:C++ 什么 区别 循环 两个      更新时间:2023-10-16

这两个循环有什么区别?我正在研究一些竞争性的编程挑战,每次我使用第一个循环变体时我都失败了,当我将其更改为第二种循环时,它通过了所有测试:

循环变体 1:

for(int j=0; j<str1.length() ; j++) {
    char ch =  str1[j]
    int diff = ch-'a';
    arr1[diff]++;
}

循环变体 2:

for(int i =0; i<str1.length() ;i++) {
    arr1[str1[i]-'a']++;
}

我知道这是一个愚蠢的问题,但请耐心等待,我只是想弄清楚为什么第一个不起作用。


示例:查找两个给定字符串作为字谜所需的最小字符删除数

输入:CDE美国广播公司

输出:四

代码不正确

void minDeletions(string str1, string str2) {
    if(str1 == str2){
        cout << 0 << endl;
        return;
    }
    int arr1[26] = {0};
    int diff,diff1;
    for(int i =0; i<str1.length() ;i++) {
        char ch =  str1[i];
        diff = ch-'a';
        arr1[diff]++;
    }
    int arr2[26] = {0};
    for(int j=0; j<str2.length() ; j++) {
        char ch =  str2[j];
        diff1 = ch-'a';
        arr2[diff]++;
    }
    int count = 0;
    for(int k=0; k<26 ; k++){
        if(arr1[k]!=arr2[k]){
            count += abs(arr1[k]-arr2[k]);
        }
    }
    cout << count << endl;
} 
int main() {
    string str1,str2;
    cin >> str1;
    cin >> str2;
    minDeletions(str1,str2);
    return 0;
}

失败的测试用例示例

输入:

 fcrxzwscanmligyxyvym
 jxwtrhvujlmrpdoqbisbwhmgpmeoke

输出:

30

难道不是这样吗?与第二个循环变体相比,它工作正常,这里没有明确的int diff是混淆的来源(见下文):

int arr1[26] = {0};
int diff, diff1;
for(int i = 0; i < str1.length() ; i++){
    char ch =  str1[i];
    diff = ch - 'a';
//  ^^^^
    arr1[diff]++;
//       ^^^^
}
int arr2[26] = {0};
for(int j = 0; j < str2.length() ; j++){
    char ch =  str2[j];
    diff1 = ch - 'a';
//  ^^^^^
    arr2[diff]++;
//       ^^^^
}

附言:仔细观察,两个循环使用相同的索引! 即,在第一个循环中获得值后,它不会在第二个循环中更新。