这是我的逻辑。我编写了计算编号的函数。字符串中每个字母的出现次数。但这不能正常工作。纠正我。
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 许可协议
如果我称之为
我得到每个字母的不同频率:
这里有一个线索:每个字母的计数都会减少。你的
for
循环从
i+1
运行到字符串的末尾,因此不会回顾以前出现的给定字母。如果我们只是将该行更改为再次从字符串的开头运行:我们越来越近了:
但是,现在我们已经比较了
str[i]
与str[j]
时i==j
所以对每个字母进行额外计数。我们可以这样排序:
给予:
现在,如果我们使用
std::map
来存储每个字母的计数,我们可以避免它一遍又一遍地告诉我们一个字母出现了多少次。事实上,既然您将其标记为 C++,那么我们也可以使用基于范围的 for 循环和
std::cout
:给更整洁: