0Pricing
Coding Interview Prep · 课时

面试必备的 Python 字符串 API

练习 split、join、replace、find、ord/chr 和字符串格式化模式,解决涉及解析与转换的面试题。

面试必备的 Python 字符串 API 是 CoddyKit 上的免费 Coding Interview Prep 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Coding Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Coding Interview Prep 课程共包含 4 节课。

Python 中的字符串不可变

Python 字符串是不可变的——您无法原地修改其中的字符。任何看似修改字符串的操作实际上都会创建一个新字符串。这意味着 s[0] = 'X' 会引发 TypeError。需要原地操作时,请先将字符串转换为字符列表,完成处理后再使用 ''.join(chars) 重建字符串。这是字符串修改问题中的标准面试模式。

s = 'hello'
# s[0] = 'H'  # TypeError!

# In-place mutation pattern:
chars = list(s)
chars[0] = 'H'
result = ''.join(chars)
print(result)  # 'Hello'

# Reversing a string
print(s[::-1])           # 'olleh'
print(''.join(reversed(s)))  # 'olleh'

split() 和 join():解析与构建

s.split(sep) 按分隔符拆分字符串,并返回子字符串列表。sep=None(默认值)会按任意空白字符拆分,并丢弃空字符串,非常适合解析以空格分隔的输入。'sep'.join(iterable) 会在字符串之间插入分隔符并将它们连接起来。' '.join(words) 是从列表构建空格分隔字符串的高效方式——绝不要在循环中使用 +。

# split
sentence = '  hello   world  '
words = sentence.split()    # ['hello', 'world']
print(words)

csv = 'a,b,c,d'
parts = csv.split(',')      # ['a', 'b', 'c', 'd']
print(parts)

# join
print(' '.join(words))      # 'hello world'
print(','.join(['x','y','z']))  # 'x,y,z'

# Reverse words in a sentence
print(' '.join(sentence.split()[::-1]))  # 'world hello'

find()、index() 和 in

s.find(sub) 返回 sub 第一次出现的位置;如果找不到,则返回 -1。s.index(sub) 的作用相同,但在目标不存在时会引发 ValueError——在面试代码中更推荐使用 find,以避免未处理的异常。字符串的 in 运算符执行 O(n×m) 的子字符串搜索,与 find 相同。使用可选的 start 和 end 参数,可以在切片范围内搜索而无需复制字符串。

s = 'abcabcabc'
print(s.find('bc'))          # 1  (first occurrence)
print(s.find('bc', 2))       # 4  (search from index 2)
print(s.find('xyz'))         # -1 (not found)
print('abc' in s)            # True

# Count occurrences manually
count = 0
start = 0
while True:
    idx = s.find('bc', start)
    if idx == -1: break
    count += 1
    start = idx + 1
print(count)  # 3

replace()、strip() 与大小写方法

s.replace(old, new, count=-1) 返回一个新字符串,将所有出现的位置(或前 count 个出现位置)替换掉。s.strip() 会移除开头和结尾的空白字符(或指定字符)。大小写方法 lower()、upper()、capitalize() 和 swapcase() 都会创建新字符串——请记住保存它们的返回值,因为这些方法不会修改原字符串。在比较之前统一大小写,对于不区分大小写的问题至关重要。

s = '  Hello, World!  '
print(s.strip())          # 'Hello, World!'
print(s.strip().lower())  # 'hello, world!'

print('banana'.replace('a', 'o'))   # 'bonono'
print('banana'.replace('a', 'o', 2)) # 'bonona'

# Normalise for comparison
def same_ignoring_case(a, b):
    return a.lower() == b.lower()

print(same_ignoring_case('Racecar', 'racecar'))  # True

startswith()、endswith() 和 isalnum()

谓词字符串方法返回布尔值,其时间复杂度为 O(k),其中 k 是模式的长度。s.startswith(prefix) 和 s.endswith(suffix) 接受元组,以支持多个备选项。s.isalpha()、s.isdigit()、s.isalnum() 和 s.isspace() 用于测试字符类别。这些方法常用于有效回文、有效数字和 URL 解析等面试题。

print('hello'.startswith('hel'))   # True
print('hello'.endswith(('lo', 'la')))  # True

# isalnum for palindrome filtering
def clean(s):
    return ''.join(c.lower() for c in s if c.isalnum())

print(clean('A man, a plan, a canal: Panama'))
# 'amanaplanacanalpanama'
print(clean('123abc!@#'))
# '123abc'

ord()、chr() 与 ASCII 算术

ord(c) 返回字符 c 的 Unicode 码点。chr(n) 将整数转换回字符。对于小写字母,ord(c) - ord('a') 会得到 0 到 25——这是一种简洁的方法,可以在不使用哈希表的情况下构建固定大小为 26 的频率数组;对于英文字母,实际运行通常更快。这项技术常见于字谜和回文问题。

print(ord('a'))   # 97
print(ord('z'))   # 122
print(chr(65))    # 'A'

# Frequency array for lowercase letters
def char_freq(s):
    freq = [0] * 26
    for c in s:
        freq[ord(c) - ord('a')] += 1
    return freq

print(char_freq('anagram'))  # [3,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0]
# index 0='a'(3), 6='g'(1), 12='m'(1), 17='r'(1)

用于输出的字符串格式化

在编程面试中,有时需要生成 clean 输出。Python 提供三种格式化风格:% 格式化(旧式)、.format()(经典方式)和 f 字符串(现代且首选)。f 字符串的可读性最高,并且直接支持表达式:f'{value:.2f}' 会将浮点数格式化为保留 2 位小数的形式。掌握如何快速格式化数字、填充字符串和输出表格,可以减少时间压力下的调试时间。

name = 'Alice'
score = 95.678

# f-string (preferred in interviews)
print(f'{name}: {score:.1f}')      # Alice: 95.7
print(f'{name:>10}: {score:05.1f}') # right-align

# Zero-pad an integer
print(f'{42:04d}')   # 0042

# Join and format a list
nums = [1, 2, 3, 4]
print(', '.join(str(n) for n in nums))  # '1, 2, 3, 4'

使用 join() 高效构建字符串

在循环中使用 + 拼接字符串会在每次迭代时创建一个新字符串,对于 n 个字符,总成本为 O(n²)。正确的模式是:将各个部分 append 到列表中,最后调用 ''.join(parts),这样时间复杂度为 O(n)。这是 Python 中最常见的性能反模式之一。在面试中提到这一权衡,能够体现您对 Python 内存模型的理解。

# SLOW: O(n^2) due to repeated string allocation
def build_bad(chars):
    s = ''
    for c in chars:
        s += c  # creates a new string each time!
    return s

# FAST: O(n)
def build_good(chars):
    parts = []
    for c in chars:
        parts.append(c)
    return ''.join(parts)  # single allocation

# Or even more concise:
def build_best(chars):
    return ''.join(chars)

print(build_best(['h','e','l','l','o']))  # 'hello'

从字符串解析整数和浮点数

在字符串和数字之间进行转换是解析问题的基础。int(s) 和 float(s) 可以解析数字字符串;遇到无效输入时会引发 ValueError。为了更安全地解析,请使用异常捕获代码块。字符串方法 isdigit() 和 isnumeric() 可以在转换前进行预验证。“字符串转整数”这类问题需要处理开头的空格、符号和溢出。

def my_atoi(s):
    s = s.lstrip()  # remove leading spaces
    if not s: return 0
    sign = 1
    idx = 0
    if s[0] in '-+':
        sign = -1 if s[0] == '-' else 1
        idx = 1
    num = 0
    while idx < len(s) and s[idx].isdigit():
        num = num * 10 + int(s[idx])
        idx += 1
    result = sign * num
    INT_MAX, INT_MIN = 2**31 - 1, -(2**31)
    return max(INT_MIN, min(INT_MAX, result))

print(my_atoi('   -42'))          # -42
print(my_atoi('4193 with words'))  # 4193

算法问题中的字符串切片

字符串切片使用非常频繁,但存在隐藏成本:s[i:j] 会创建一个长度为 j-i 的新字符串,时间复杂度为 O(j-i)。需要将子字符串传递给递归函数时,可以考虑传递索引(start、end),而不是实际的子字符串,以避免 O(n²) 的分配开销。在最长回文子字符串这类需要检查大量子字符串的问题中,这项优化十分重要。

# Naive: O(n^3) because slicing inside nested loops
def is_palindrome_naive(s):
    return s == s[::-1]  # O(n) slice + O(n) compare

# Pass indices to avoid allocating substrings
def is_palindrome_range(s, left, right):
    while left < right:
        if s[left] != s[right]:
            return False
        left += 1; right -= 1
    return True  # O(right-left) time, O(1) space

print(is_palindrome_range('racecar', 0, 6))  # True
print(is_palindrome_range('hello',   0, 4))  # False

字符串面试速查

请在脑中熟记这些字符串方法,以便应对面试:

  • split / join — 解析和构建
  • strip / lstrip / rstrip — 去除空白字符
  • lower / upper — 规范化大小写
  • find / index — 查找子字符串
  • replace — 替换
  • isalnum / isalpha / isdigit — 检查字符类别
  • ord / chr — 用于固定字符集问题的 ASCII 运算
  • startswith / endswith — 检查前缀和后缀

# Combining methods: reverse words, preserve spaces
def reverse_words(s):
    return ' '.join(reversed(s.split()))

print(reverse_words('  hello   world  '))
# 'world hello'

# Check anagram using sorted strings
def is_anagram(s, t):
    return sorted(s) == sorted(t)

print(is_anagram('anagram', 'nagaram'))  # True
print(is_anagram('rat', 'car'))          # False

快速检查

请测试您对本课数据结构与算法——编程面试准备相关概念的理解。

课程回顾

本课您学习了:Python 字符串不可变——修改字符串需要先将其转换为列表,进行修改,然后再连接回字符串;ord/chr 可以为小写字母问题构建大小为 26 的固定长度频率数组,对于有界字符集而言,这比哈希映射更快;以及在循环中使用 + 构建字符串的成本为 O(n²),应始终先将内容累积到列表中,最后使用 ''.join(),从而达到 O(n)。接下来我们将学习用于子字符串问题的滑动窗口技巧。

常见问题解答

「面试必备的 Python 字符串 API」课时是免费的吗?

是的 — 「面试必备的 Python 字符串 API」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Coding Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 Coding Interview Prep 课程共包含 4 节课。

「面试必备的 Python 字符串 API」这节课中我会学到什么?

练习 split、join、replace、find、ord/chr 和字符串格式化模式,解决涉及解析与转换的面试题。 你通过在浏览器中直接运行的动手代码来练习 Coding Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Coding Interview Prep 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Coding Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「面试必备的 Python 字符串 API」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Coding Interview Prep 课中编写并运行代码吗?

能。每节 Coding Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 面试必备的 Python 字符串 API
  2. 子串的滑动窗口
  3. 字母异位词与字符频率映射
  4. 字符串编码、反转与回文
← 返回 Coding Interview Prep