60 秒回答模板

最直接做法是用哈希表或固定长度数组统计字符频次。遍历字符串时只统计题目要求的字母范围,例如 a-z 或 A-Z;每次更新频次后同步维护 maxCount 和 bestChar,或统计完成后再遍历频次数组找最大值。复杂度 O(n),若字符集固定则空间 O(1)。面试时要问清大小写是否合并、非字母是否忽略、多个字母同频时返回字典序最小、最先出现还是全部输出。

考点 频次统计
难度 真实面经题
回答目标 讲清原理、实现和边界

深入解析

01

先确认字符规则

题目说字母时要确认只包含小写、是否包含大写、是否忽略空格标点。不同规则会影响统计结构和并列处理,也会影响返回值约定。

02

频次数组或哈希表

如果只统计 26 个小写字母,用长度 26 的数组即可;如果字符集不固定,用 Map 记录字符到出现次数的映射更通用,但空间取决于不同字符数。

03

维护最大值

可以边统计边更新最高频字符,也可以统计结束后扫描频次表。边统计更快得到结果,但并列规则复杂时后扫描更清晰,代码也更容易验证。

04

并列策略

多个字符频率相同要按题意返回。常见策略包括返回最先达到最高频的字符、字典序最小字符或返回所有最高频字符,不能默认随便选。

05

复杂度和边界

遍历字符串一次,时间 O(n)。空字符串、没有字母、Unicode 字符和大小写归一化都是实现前要说明的边界条件。

javascript

小写字母的一次遍历频次统计

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 的字符。

流式输入能否处理?

可以持续更新频次表和当前最高频信息,但并列规则如果要求字典序或全部字符,需要保留完整频次表。