打印最先出现的字母的算法

时间:2019-05-11 13:49:48

标签: java

我需要修复打印出现频率最高的字母的算法。如果有两个字母出现相同,则应按字母顺序返回。 最大变化:4

我不明白首先要做什么。我以为这是关于ascii表的,但是occurence[0]打印0。 我知道不好的是,单词“ hppzz”会显示z。

这是算法:

String findTheMostOccuredLetter(String S) {
        int[] occurrences = new int[26];
        for (char ch : S.toCharArray()) {
            occurrences[ch - 'a']++;
        }

        char best_char = 'a';
        int  best_res  = 0;

        for (int i = 1; i < 26; i++) {
            if (occurrences[i] >= best_res) {
                best_char = (char)((int)'a' + i);
                best_res  = occurrences[i];
            }
        }

        return Character.toString(best_char);
    }

我以另一种方式制定了该算法,但是这种方式对我来说很糟糕。 我该在那改变什么?

1 个答案:

答案 0 :(得分:2)

打印出现次数最多的字母。如果它们相同,则首先按字母顺序返回。

更新: 首先,您使用ASCII码作为数组索引,并且数组中的第一个值等于字母a的频率。另外,数组中的26个值与字母a到字母z的频率值相同。 (请参见代码中的“注释1”)

因此,如果以相反的顺序搜索数组,则当频率相同时,输出将按字母顺序排列。 (请参阅“评论2”

String findTheMostOccuredLetter(String S) {
    // Comment 1: initialize array
    int[] occurrences = new int[26];
    for (char ch : S.toCharArray()) {
        occurrences[ch - 'a']++;
    }

    char best_char = 'a';
    int  best_res  = 0;

    // Comment 2: the array is searched in reverse order
    // for (int i = 1; i < 26; i++) { // it is your code
    for (int i = occurrences.length - 1; i >= 0 ; i--) {
        if (occurrences[i] >= best_res) {
            best_char = (char)((int)'a' + i);
            best_res  = occurrences[i];
        }
    }

    return Character.toString(best_char);
}