![](/img/trans.png)
[英]Implement a function which takes a string as an input and returns a new one without consonant letters replaced with “!”
[英]function which takes a string as input and returns the most frequent character
我写了一个功能。 它工作正常。 但在我看来,这不是最优的。 但是我还没有找到可以用来释放它的标准功能。 因为我把它变成了一种简单的值。 而且执行需要很长时间
char getMaxOccuringChar(char* str)
{
int count[ASCII_SIZE] = {0};
int len = strlen(str);
int max = 0;
char result;
for (int i = 0; i < len; i++) {
count[str[i]]++;
if (max < count[str[i]]) {
max = count[str[i]];
result = str[i];
}
}
return result;
}
这是我使用标准库编写它的方式:
#include <algorithm>
#include <unordered_map>
#include <string_view>
char most_frequent_char(std::string_view str) {
std::unordered_map<char, int> counts;
for (auto c : str) counts[c] += 1;
return std::max_element(
begin(counts), end(counts),
[](auto a, auto b) {return a.second < b.second;}
)->first;
}
但老实说,我对手动迭代字符串以计算其字符不满意。 在实际代码中,我可能会抽象出频率表的创建,它可能还有一个max
function。 在 Python 中,这直接对应于collections.Counter
class。 如果我们假设存在此实用程序 class(留给读者作为练习),则实现变为
char most_frequent_char(std::string_view str) {
return max(freq_table{str}).first;
}
char getMaxOccuringChar(char* str)
{
auto s = std::string(str);
auto cmap = std::map<char, size_t>{}
for (auto c : s) {
cmap[c]++;
}
auto found = std::max_element(cmap.begin(), cmap.end(),
[] (auto p1, auto p2) {
return p1.second < p2.second;
}
);
return found.first;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.