最近在准备技术面试的朋友可能会遇到一类高频题——压缩算法。这类题目不仅考察编程能力,还涉及对数据结构和算法优化的理解。尤其在前端、后端甚至移动端岗位中,出现频率越来越高。
为什么面试爱考压缩算法?
互联网每天产生海量数据,传输和存储成本很高。比如你发个朋友圈,照片如果没压缩,可能几十MB,加载半天。公司希望工程师能写出更高效、省带宽的代码,所以压缩相关的逻辑就成了面试重点。
最常考的题型:字符串压缩
题目大概是这样:给定一个字符串,比如 "aaabbc",把它压缩成 "a3b2c1"。如果压缩后不比原串短,就返回原串。
这题看似简单,但写全所有边界情况并不容易。比如空字符串、单字符、连续字符长度超过9的情况(会不会变成a11还是a1a1)。
def compress_string(s):
if not s:
return s
result = []
current_char = s[0]
count = 1
for i in range(1, len(s)):
if s[i] == current_char:
count += 1
else:
result.append(current_char + str(count))
current_char = s[i]
count = 1
result.append(current_char + str(count))
compressed = ''.join(result)
return compressed if len(compressed) < len(s) else s
Huffman 编码也有可能被问到
虽然手撕Huffman树在短时间内不太现实,但面试官可能会让你讲思路:怎么根据字符频率构建最优前缀编码?这时候你得说出“频率低的放深节点,用优先队列合并最小两个频次”这些关键词。
实际生活中,ZIP压缩、JPEG图片、MP3音频都用了类似思想。你电脑上右键一个文件“添加到压缩包”,背后就是这些算法在跑。
别忘了了解真实应用场景
面试时如果能提到Gzip是基于LZ77,PNG用的是DEFLATE,甚至浏览器请求头里的Accept-Encoding字段支持gzip、br等格式,立刻显得你不是死背题,而是真懂应用。
有个朋友面试时被问:“网页资源压缩有哪些方式?”他答了Gzip、Brotli,还说了Brotli比Gzip压缩率高但耗CPU,最后提了一句“我们公司CDN默认开Brotli”,当场就被夸有工程思维。
小建议:动手实现一遍
光看题解不行。找个周末,自己从头写个字符串压缩函数,再试试模拟哈夫曼编码的步骤。你会发现,很多细节只有动手才会暴露,比如字符计数重置时机、字符串拼接性能问题。
这类题本质考的是:能不能把一个现实问题转化成代码逻辑,同时兼顾效率和鲁棒性。多练几遍,面试时自然不慌。