Python面试30分钟突击掌握-LeetCode2-Strings

如果你正在准备 Python 开发岗面试,而且希望在短时间内稳定拿分,这篇字符串专题你可以直接拿去复习。

上一篇我们练了 Array,这一篇进入 Strings。

字符串题目看起来"像语文题",但面试官考察的依旧是同一套核心能力:

  • 能不能快速识别题目模型;
  • 能不能写出简洁、可靠的代码;
  • 能不能把复杂度讲清楚;
  • 能不能处理边界条件和追问。

为什么 Strings 是面试高频?

字符串是业务开发中的常客:日志处理、接口参数校验、文本匹配、数据清洗都离不开它。

所以在 Python 面试里,Strings 题目出现频率非常高,而且经常作为热身题或第一题。

如果你只有 30 分钟,建议优先吃透下面两题:

  • Reverse String
  • First Unique Character in a String

这两题分别代表了字符串中的两种基础能力:

  • 双指针原地处理
  • 哈希统计与二次遍历定位

今天的突击目标

不要贪多,先把这四件事做到位:

  • 不看答案,能独立写出 AC;
  • 复杂度分析能脱口而出;
  • 能说明"为什么这样做是最合适的";
  • 能主动提到常见坑点和边界情况。

题目一:Reverse String(反转字符串)

题目描述

给你一个字符数组 s,请你将其反转。

要求你必须原地修改 输入数组,并且只使用 O(1) 的额外空间。

示例:

  • 输入:["h","e","l","l","o"],输出:["o","l","l","e","h"]
  • 输入:["H","a","n","n","a","h"],输出:["h","a","n","n","a","H"]

面试中的思考路径

不少同学会先想到 s[::-1],这在 Python 里很常见,但它会创建新对象。

题目明确要求 in-place(原地),所以要用双指针交换:

  • left 从头开始;
  • right 从尾开始;
  • 每轮交换后分别向中间移动;
  • 当 left >= right 时结束。

Python 参考实现

python 复制代码
from typing import List


class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        不返回任何值,直接在原数组上修改。
        """
        left, right = 0, len(s) - 1
        while left < right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1

复杂度分析

  • 时间复杂度:O(n),每个元素最多参与一次交换;
  • 空间复杂度:O(1),只使用常数个额外变量。

面试易错点

  • 用切片或 reversed() 生成新列表,不满足原地修改要求;
  • 忘记说明为什么是 O(1) 空间;
  • 指针边界条件写错(例如 <= 与 < 混淆)。

题目二:First Unique Character in a String(字符串中的第一个唯一字符)

题目描述

给定一个字符串 s,找到它的第一个不重复字符,并返回它的索引。

如果不存在,返回 -1。

示例:

  • 输入:"leetcode",输出:0
  • 输入:"loveleetcode",输出:2
  • 输入:"aabb",输出:-1

面试中的思考路径

这题最稳妥的方式是"两次遍历 + 哈希计数":

  1. 第一次遍历:统计每个字符出现次数;
  2. 第二次遍历:按原字符串顺序找第一个计数为 1 的字符。

为什么要两次?

因为"第一个唯一字符"强调的是顺序,光统计次数还不够,必须回到原序列中定位。

Python 参考实现

python 复制代码
class Solution:
    def firstUniqChar(self, s: str) -> int:
        freq = {}
        for ch in s:
            freq[ch] = freq.get(ch, 0) + 1

        for i, ch in enumerate(s):
            if freq[ch] == 1:
                return i
        return -1

复杂度分析

  • 时间复杂度:O(n),两次线性遍历,仍是线性级别;
  • 空间复杂度:O(k),k 为字符集大小。若限定为小写字母,可视为常数级。

面试易错点

  • 统计完次数后直接返回某个字符,而不是索引;
  • 用 set 去重导致顺序信息丢失;
  • 没有处理"全部重复"的情况,漏掉返回 -1。

30 分钟高效练习法(Strings 版)

你可以按这个节奏执行:

  1. 5 分钟:先口述两题思路,不写代码;
  2. 10 分钟:手写代码并自测示例;
  3. 10 分钟:补上复杂度、边界条件、易错点;
  4. 5 分钟:模拟面试表达,尽量脱稿复述。

重点不是"写完",而是"讲清楚你为什么这么写"。


面试表达模板

你可以这样说:

这题我会先判断是否需要保留原顺序。

如果需要保序并且要快速查询,我会考虑哈希表做计数或索引映射。

在复杂度上,我目标是时间 O(n),空间根据题目约束尽量控制在 O(1) 或可接受范围。

写完后我会重点检查边界:空串、全重复、单字符、重复字符位置等。

这段话对大部分字符串基础题都适用,能显著提升你的表达质量。


小结

Strings 题目的本质并不"玄学",核心还是数据结构与遍历策略。
Reverse String 和 First Unique Character in a String 是字符串面试的基础分,建议你做到:

  • 代码熟练到能一遍写对;
  • 复杂度分析不用停顿;
  • 面试官追问时能解释设计取舍;
  • 能清楚指出这题常见的错误写法。

下一篇你可以继续练 Linked List,把"数组 + 字符串 + 链表"这三块基础打牢,Python 岗算法面试会稳很多。

相关推荐
happylifetree3 小时前
Python70:核心语法-函数进阶-案例2
python
王中阳Go4 小时前
两个入口答案不一致先别调模型:6 行入口口径对账表(附脚本)
人工智能·后端·python·大语言模型·1024程序员节
BK贝壳4 小时前
bool-hybrid-array 落盘我只认 .bha:用 Create_BHA / Ask_BHA 做布尔数组序列化
数据结构·python·numpy·1024程序员节
Sakura_j_h_4 小时前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务
supabc1236 小时前
欧盟电子发票(XRechnung/Peppol/ZUGFeRD)踩坑记:用 Python 不装 Java 跑官方校验规则
xml·python·开源·电子发票·1024程序员节
ZhengEnCi6 小时前
AI Agent工具调用防护层怎么写-一份能直接跑的Python四层拦截实现
python·llm·agent
ZhengEnCi6 小时前
AI Agent工具误调用怎么解决-从参数校验到高危二次确认的四层工程防线
python·llm·agent
镜子AI8 小时前
镜子AI工程教程:用Python实现关键词布局检查器与语义改写查重(附完整代码)
人工智能·python·microsoft
小oo呆9 小时前
【学习心得】Python协程
python
信誓旦旦的程序猿9 小时前
【Python量化实战宝典 #22】涨跌停、连板情绪手册:情绪指标构建(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口