如何优化这段实现字符串元音翻转的Python代码?
字符串元音翻转代码优化建议
你的代码思路是可行的:先提取所有元音并反转,再遍历原字符串替换元音位置。不过从面试角度,有几个可以优化的点,同时可以提供更高效的双指针实现方案:
原代码的优化细节
- 变量命名规范:避免使用
list这种内置类型名作为变量名,改成chars更清晰;list_vowels可以改为reversed_vowels,语义更明确。 - 提升查找效率:元音判断用集合
set('aeiouAEIOU')代替字符串,集合的成员查询时间复杂度是O(1),比字符串的O(k)(k为字符串长度)更快,处理长字符串时优势更明显。 - 遍历方式优化:用
enumerate遍历字符和索引,比range(len(s))更直观易读。
优化后的原思路代码:
class Solution: def reverseVowels(self, s: str) -> str: vowels = set('aeiouAEIOU') reversed_vowels = [x for x in s if x in vowels][::-1] chars = list(s) idx = 0 for i, char in enumerate(chars): if char in vowels: chars[i] = reversed_vowels[idx] idx += 1 return ''.join(chars)
更高效的双指针实现(面试加分项)
原思路需要额外存储所有元音,空间复杂度为O(n)。双指针法可以在字符串转列表后原地交换元音,空间复杂度优化为O(1)(忽略字符串转列表的必要空间),逻辑也更贴合“翻转”的直观操作:
class Solution: def reverseVowels(self, s: str) -> str: vowels = set('aeiouAEIOU') chars = list(s) left, right = 0, len(chars) - 1 while left < right: # 左指针从左往右找元音 while left < right and chars[left] not in vowels: left += 1 # 右指针从右往左找元音 while left < right and chars[right] not in vowels: right -= 1 # 找到元音后交换位置 chars[left], chars[right] = chars[right], chars[left] left += 1 right -= 1 return ''.join(chars)
面试中的注意点
- 要保持对大小写元音的兼容处理,这是题目隐含的要求。
- 可以先和面试官确认需求边界,比如是否需要处理特殊字符(一般题目默认输入为常规字符串)。
- 解释代码时,要清晰说明逻辑:双指针从两端向中间遍历,找到元音就交换,直到指针相遇,以此实现元音位置的翻转。
内容的提问来源于stack exchange,提问作者Reds D Moh
相关产品推荐
相关产品推荐

