计算字符串中每个字母出现的次数

新手上路,请多包涵

这是我的逻辑。我编写了计算编号的函数。字符串中每个字母的出现次数。但这不能正常工作。纠正我。

 void countChar(char *str) {
    int i, j, cnt = 1;
    int l = strlen(str);
    for (i = 0; i < l; i++) {
        for (j = i + 1; j < l; j++) {
            if (str[i] == str[j])
                cnt++;
        }
        printf("\n %c occurs : %d times", str[i], cnt);
        cnt = 1;
    }
}

如果我输入 Hello 那么它会生成以下输出:

 h occurs : 1 times
e occurs : 1 times
l occurs : 2 times
l occurs : 1 times
o occurs : 1 times

预期输出:

 h occurs : 1 times
e occurs : 1 times
l occurs : 2 times
o occurs : 1 times

原文由 Heli Pareshkumar Shah 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 870
1 个回答

如果我称之为

countChar("aabbccda");

我得到每个字母的不同频率:

  a occurs : 3 times
 a occurs : 2 times
 b occurs : 2 times
 b occurs : 1 times
 c occurs : 2 times
 c occurs : 1 times
 d occurs : 1 times
 a occurs : 1 times

这里有一个线索:每个字母的计数都会减少。你的 for 循环

for(j=i+1;j<l;j++)

i+1 运行到字符串的末尾,因此不会回顾以前出现的给定字母。如果我们只是将该行更改为再次从字符串的开头运行:

 for(j=0;j<l;j++)
//    ^------

我们越来越近了:

  a occurs : 4 times
 a occurs : 4 times
 b occurs : 3 times
 b occurs : 3 times
 c occurs : 3 times
 c occurs : 3 times
 d occurs : 2 times
 a occurs : 4 times

但是,现在我们已经比较了 str[i]str[j]i==j 所以对每个字母进行额外计数。

我们可以这样排序:

 void countChar(char *str){
    int i, j, cnt = 1;
    int l = strlen(str);
    for(i=0; i<l; i++){
        for(j=0; j<l; j++){
            if(i!=j && str[i] == str[j]){
            // ^---- extra check
                cnt++;
            }
        }
        printf("\n %c occurs : %d times",str[i],cnt);
        cnt=1;
    }
}

给予:

 a occurs : 3 times
a occurs : 3 times
b occurs : 2 times
b occurs : 2 times
c occurs : 2 times
c occurs : 2 times
d occurs : 1 times
a occurs : 3 times

现在,如果我们使用 std::map 来存储每个字母的计数,我们可以避免它一遍又一遍地告诉我们一个字母出现了多少次。

事实上,既然您将其标记为 C++,那么我们也可以使用基于范围的 for 循环和 std::cout

 void countCharImproved(char *str) {
    std::map<char, int> count;
    int l = strlen(str);
    for(int i=0; i<l; i++) {
        count[str[i]]++;
    }
    for(const auto kvp : count) {
        std::cout << kvp.first << " occurs " << kvp.second << " times\n";
    }
}

给更整洁:

 a occurs 3 times
b occurs 2 times
c occurs 2 times
d occurs 1 times

原文由 doctorlove 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题