我需要修复打印出现频率最高的字母的算法。如果有两个字母出现相同,则应按字母顺序返回。 最大变化: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);
}
我以另一种方式制定了该算法,但是这种方式对我来说很糟糕。 我该在那改变什么?
答案 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);
}