Python技术迷

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。

面试里问到这种题,怎么回答才显得你不只是会写代码?

这类题在面试里非常常见,主要考你两个东西:

  1. 基本数据结构的掌握(能不能想到用 dict 或 Counter)
  2. 算法复杂度的考虑(你用 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高级架构师资料合集》。

资料包含了《IDEA视频教程》、《最全python面试题库》、《最全项目实战源码及视频》及《毕业设计系统源码》,总量高达650GB,全部免费领取。