python面试题:如何删除字符串中的所有空格
在 Python 群里看到一段代码,乍一看没毛病,但越琢磨越不对劲。
deffirst_non_repeating_character(s):
for i in s:
if s.count(i) == 1:
return i
returnNone
这是在找一个字符串里第一个“没有重复”的字符,比如 "swiss" 这段,就返回了 'w',看上去像模像样。
但作为一个干 Python 的,不能只看“结果对不对”,还得看“怎么对的”。这段代码在处理逻辑上是没错,但性能那叫一个惨不忍睹。
count用起来爽,背后火葬场
你要知道,s.count(i) 每次执行,都会重新遍历字符串 s 来数字符 i 出现了几次。
也就是说,如果字符串长度是 n,最坏情况下你得遍历 n 次,每次又是遍历 n,整个时间复杂度飙到 **O(n²)**。小字符串无所谓,一旦量上来就分分钟被性能打脸。
比如 "aabbccddeeffg" 这种 13 个字符的串,其实已经会调用 count() 十几次。如果你在大厂日志处理或者用户数据处理中,用了这个逻辑,轻则代码被挂 Code Review,重则上线当场爆炸——你懂的,监控报警+工单+领导电话全来了。
优雅又高效的写法该咋写?
既然问题是重复使用 count(),那咱们换个思路,提前把每个字符出现次数都算好,然后一遍扫过去不就完了?
from collections import OrderedDict
deffirst_non_repeating_character(s):
char_count = OrderedDict()
for char in s:
char_count[char] = char_count.get(char, 0) + 1
for char, count in char_count.items():
if count == 1:
return char
returnNone
这里用的是 OrderedDict,为了保留字符出现的顺序(从左往右找第一个不重复的字符),而且只遍历两次:一次统计,一次查找,性能提升显著,时间复杂度稳定在 **O(n)**。
如果你用的是 Python 3.7+,普通的 dict 也已经默认有顺序了,可以直接用,不一定非得上 OrderedDict。
面试里问到这种题,怎么回答才显得你不只是会写代码?
这类题在面试里非常常见,主要考你两个东西:
基本数据结构的掌握(能不能想到用 dict 或 Counter) 算法复杂度的考虑(你用 count 就等着被问 O(n²))
面试官问你怎么优化,如果你还在用 count(),那真的建议提前告辞。
你可以这么回答:
面试题最优答案:
“这个题目我第一反应会想到暴力做法,比如对每个字符用 count() 检查出现次数,但考虑到 count() 是 O(n) 的,如果字符串很长,整体时间复杂度会退化成 O(n²),在性能上不太理想。
为了优化,我会使用一个哈希表,比如 dict 来统计每个字符出现的次数,这样第一次遍历统计,第二次遍历找出第一个值为 1 的字符,总体复杂度是 O(n)。另外,如果要求保留原始顺序,在 Python 3.7 以上我可以直接用 dict;如果是老版本,可以使用 collections.OrderedDict。”
记住一句话,会写能跑的是初级,会写又能跑得快的才是中级,知道什么场景能跑、什么时候不能跑的,那才是高级。
所以,不要小看面试题里这些“基础题”,你对待的态度,决定你拿 offer 的姿态。
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。