繁体   English   中英

function 将字符串作为输入并返回最常见的字符

[英]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;
}

使用 map 和 max_element

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM