📌 面试题原题:
「请实现一个函数,能将输入的字符串 'aaabbbccca' 压缩成 'a3b3c3a1',并讨论可能的边界情况。」
(字节/腾讯/阿里等大厂高频题)
💡 为什么这道题能筛掉80%的候选人?
你以为考的是简单的字符串操作?错! 面试官在暗中观察这些核心能力:
- 基础编码能力:
for循环都写不对的直接淘汰 - 边界思维:空字符串、非字母字符、大小写敏感等问题
- 性能意识:能用
O(n)时间复杂度解决吗? - 代码风格:变量命名、可读性、函数拆分
🚀 参考答案(附逐行解析)
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:忘记处理连续字符结尾
// 错误示例:输入 'aaa' 输出 'a3undefined' if (str[i] === str[i + 1]) { ... } // 未处理数组越界 -
坑2:未考虑大小写敏感
'aAa'.compress() // 应该返回 'a1A1a1' 还是 'a3'? -
坑3:时间复杂度优化
用str.replace(/(\w)\1*/g, ...)正则解法看似优雅,但面试官会追问:- 「正则的时间复杂度是多少?」(答案:可能高达O(n²))
🎯 进阶追问(P6+级别必考)
- 如何用递归实现?(考察堆栈理解)
- 如果字符串包含数字怎么办?(如
'a3b2') - 如何设计测试用例?(TDD思维)
📈 数据说话
- 据某招聘平台统计:62% 的候选人在边界条件处理上失分
- 35% 的人因变量命名模糊(如用
s代替str)被扣分 - P7级 通过率不足20%,因缺乏算法优化讨论
💼 面试官忠告
“这道题就像前端开发的显微镜——能照出候选人的代码洁癖、逻辑思维和工程意识。写不出完美答案不要紧,但一定要主动讨论边界和优化!”
——某阿里P8技术面试官
🔗 延伸学习
- LeetCode 443. 字符串压缩
- 《Clean Code》第五章:函数编写原则
- 前端性能优化:Run-Length Encoding (RLE) 算法
📢 互动:你能在10分钟内写出无BUG的实现吗?评论区见!