题目重点:按每个单词首字母和词序转换,保留大小写并计算增长的输出成本。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练空白分隔ASCII字母词、无标点;元音首字母大小写都识别,其他首字母移到词尾,追加ma及按1起始词序的a。输出单空格。
解题路线
- 对word index从1开始,首字符lower属于aeiou则保持word,否则word[1:]+word[0]。保留原字符大小写,不把全词lower。
- 每词随后加ma和a重复index次。必须以词序不是字符位置计数;多空格不产生空词。
- 先收集词结果再join,避免在循环反复拼接整句话导致额外复制。输入标点若允许需另定位置,本例拒绝,不把逗号当辅音移动。
- 验证可将每词去掉确定后缀,再按元音/辅音逆变换回原词;比只看几个短样例更能查大小写和index偏移。
手动走一遍
I speak转换Imaa peaksmaaa:第1词元音保留I加ma+a;第2词s移后得peaks,再ma+aa。空文本空输出,连续空白归一。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
def goat_latin(text):
"""Whitespace-separated ASCII words, no punctuation; output single spaces."""
result=[]
for index,word in enumerate(text.split(),1):
if not word.isascii() or not word.isalpha():raise ValueError('ASCII alphabetic words')
base=word if word[0].lower() in 'aeiou' else word[1:]+word[0]
result.append(base+'ma'+'a'*index)
return ' '.join(result)
复杂度
输入字母总L、词数W,输出L+2W+W(W+1)/2再加空格,因此时间/输出空间O(L+W²),不能因只遍历W个词就标O(L)。字符串移首字母复制按词长计。
易错点与追问
容易失分的边界
- 后缀a数量从0开始少1。
- 元音判断仅小写会错误移动I/A。
继续深挖
- 如果要保持原空白格式,应如何保留分隔符而不split归一?
- 词数非常大输出本身平方增长,限额需要怎样定义?
