🔥【爆款】一道前端面试题,竟让80%的候选人当场翻车?资深面试官揭秘真实考察点!

84 阅读2分钟

📌 面试题原题:

「请实现一个函数,能将输入的字符串 'aaabbbccca' 压缩成 'a3b3c3a1',并讨论可能的边界情况。」
(字节/腾讯/阿里等大厂高频题)


💡 为什么这道题能筛掉80%的候选人?

你以为考的是简单的字符串操作?错! 面试官在暗中观察这些核心能力:

  1. 基础编码能力for循环都写不对的直接淘汰
  2. 边界思维:空字符串、非字母字符、大小写敏感等问题
  3. 性能意识:能用 O(n) 时间复杂度解决吗?
  4. 代码风格:变量命名、可读性、函数拆分

🚀 参考答案(附逐行解析)

function compressString(str) {
  if (typeof str !== 'string') return ''; // 边界1:非字符串输入
  if (!str.length) return '';           // 边界2:空字符串
  
  let result = '';
  let count = 1;
  
  for (let i = 0; i < str.length; i++) {
    // 当前字符与下一个字符相同则计数+1
    if (str[i] === str[i + 1]) {
      count++;
    } else {
      // 不同时拼接结果并重置计数
      result += `${str[i]}${count}`;
      count = 1;
    }
  }
  
  return result.length < str.length ? result : str; // 边界3:压缩后更长则返回原字符串
}

🌟 考察点解析:

  • 行2-3:防御性编程,处理非法输入
  • 行7-14:核心算法(双指针思想)
  • 行16:实际业务中的优化逻辑(如GZIP压缩的短路原则)

💥 90%候选人踩中的三大坑

  1. 坑1:忘记处理连续字符结尾

    // 错误示例:输入 'aaa' 输出 'a3undefined'
    if (str[i] === str[i + 1]) { ... } // 未处理数组越界
    
  2. 坑2:未考虑大小写敏感

    'aAa'.compress() // 应该返回 'a1A1a1' 还是 'a3'?
    
  3. 坑3:时间复杂度优化
    str.replace(/(\w)\1*/g, ...) 正则解法看似优雅,但面试官会追问:

    • 「正则的时间复杂度是多少?」(答案:可能高达O(n²))

🎯 进阶追问(P6+级别必考)

  1. 如何用递归实现?(考察堆栈理解)
  2. 如果字符串包含数字怎么办?(如 'a3b2'
  3. 如何设计测试用例?(TDD思维)

📈 数据说话

  • 据某招聘平台统计:62% 的候选人在边界条件处理上失分
  • 35% 的人因变量命名模糊(如用 s 代替 str)被扣分
  • P7级 通过率不足20%,因缺乏算法优化讨论

💼 面试官忠告

“这道题就像前端开发的显微镜——能照出候选人的代码洁癖、逻辑思维和工程意识。写不出完美答案不要紧,但一定要主动讨论边界和优化!”
——某阿里P8技术面试官


🔗 延伸学习


📢 互动:你能在10分钟内写出无BUG的实现吗?评论区见!