真实面经题目 · 原创解析
如何在给定字符串中输出出现频率最高的字母?
字符串最高频字母题的核心是一次遍历统计频次,再按题目规则处理并列、大小写、非字母字符和字符集范围。
出现于:网易 · 算法
真实面经题目 · 原创解析
字符串最高频字母题的核心是一次遍历统计频次,再按题目规则处理并列、大小写、非字母字符和字符集范围。
最直接做法是用哈希表或固定长度数组统计字符频次。遍历字符串时只统计题目要求的字母范围,例如 a-z 或 A-Z;每次更新频次后同步维护 maxCount 和 bestChar,或统计完成后再遍历频次数组找最大值。复杂度 O(n),若字符集固定则空间 O(1)。面试时要问清大小写是否合并、非字母是否忽略、多个字母同频时返回字典序最小、最先出现还是全部输出。
题目说字母时要确认只包含小写、是否包含大写、是否忽略空格标点。不同规则会影响统计结构和并列处理,也会影响返回值约定。
如果只统计 26 个小写字母,用长度 26 的数组即可;如果字符集不固定,用 Map 记录字符到出现次数的映射更通用,但空间取决于不同字符数。
可以边统计边更新最高频字符,也可以统计结束后扫描频次表。边统计更快得到结果,但并列规则复杂时后扫描更清晰,代码也更容易验证。
多个字符频率相同要按题意返回。常见策略包括返回最先达到最高频的字符、字典序最小字符或返回所有最高频字符,不能默认随便选。
遍历字符串一次,时间 O(n)。空字符串、没有字母、Unicode 字符和大小写归一化都是实现前要说明的边界条件。
function highestFrequencyLetter(s) {
const counts = Array(26).fill(0);
let bestIndex = -1;
let bestCount = 0;
for (const ch of s) {
if (ch < 'a' || ch > 'z') continue;
const index = ch.charCodeAt(0) - 97;
counts[index] += 1;
if (counts[index] > bestCount) {
bestCount = counts[index];
bestIndex = index;
}
}
return bestIndex === -1 ? null : String.fromCharCode(97 + bestIndex);
} 用长度为 26 的整型数组,字符下标由 charCode - charCode('a') 得到,空间固定。
先统计最大频次,再遍历频次表收集所有 count 等于 maxCount 的字符。
可以持续更新频次表和当前最高频信息,但并列规则如果要求字典序或全部字符,需要保留完整频次表。