题目重点:去掉大小写 ASCII 元音后反转剩余字符串,说明 Unicode 字素边界。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练元音只含 a/e/i/o/u 及大写;y、重音字符不删除。
- 反转按 Unicode code point;若要求显示字素簇需另用分段规则。
解题路线
- 删除与反转可交换顺序:对原串从末尾向前遍历,只收集非元音字符。得到与“先过滤再反转”一致结果。
- 使用集合判断避免大小写漏项,不依赖不明确的 locale lower 转换。
- 构造字符列表再 join,避免每次在不可变字符串前面拼接导致反复复制。
- 保留空格、标点和其他字符,除非题目另外要求清洗。
手动走一遍
"Hello, AI!" 过滤得到 "Hll, !",反转为 "! ,llH";全元音得到空串。组合重音可能和字母拆开,按 code point 反转不承诺视觉正确。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
def filter_reverse(text):
"""Remove ASCII a/e/i/o/u in either case; reverse code points."""
vowels = frozenset('aeiouAEIOU')
return ''.join(char for char in reversed(text) if char not in vowels)
复杂度
O(n) 时间,输出 O(n) 空间;若可变字符数组且合同允许原地,则可双指针压缩再反转。
易错点与追问
容易失分的边界
- 只去小写。
- 未经确认删除 y 或所有非字母。
- 把 code point 与字素簇混同。
继续深挖
- 如何原地处理数组?
- 用户显示文本怎样按字素反转?
