翻转字符串里的单词
问题链接:翻转字符串里的单词
问题分析
以字符串 "the sky is blue"
为例,我们首先将其按照单词进行翻转,然后再将整个字符串进行翻转。
原始字符串:"the sky is blue"
按单词翻转:"eth yks si eulb"
字符串翻转:"blue is sky the"
可以发现,经过上述翻转过程就得到了我们需要的结果。
该题的另一个关键点是如何处理原始字符串开始和结尾的多个空格,以及字符串中间的多个空格。
代码详解
def reverseWords(s):
# python 中字符串不可更改,所以将其转化为列表
s = list(s)
k = 0 # 记录字符放置的位置
i = 0
while i < len(s):
# 去除前导空字符
while (i < len(s) and s[i] == " "):
i += 1
if (i == len(s)):
break
# i 为单词的首字母, j-1 为单词的尾字母
j = i
while (j < len(s) and s[j] != " "):
j += 1
start = i
end = j - 1
while (start <= end):
s[start], s[end] = s[end], s[start]
start += 1
end -= 1
# 结束一个单词,将该位置置空,从下一个位置开始放
if (k):
s[k] = " "
k += 1
while (i < j):
s[k] = s[i]
k += 1
i += 1
s = s[:k-1]
return "".join(s[::-1])
if __name__ == "__main__":
s = "the sky is blue"
print(reverseWords(s))
代码优化
直接按照空格来分割字符串,然后将所有的单词转化为一个列表,将列表逆序并进行拼接,一行代码可以完成。
def reverseWords2(s):
return " ".join(s.split()[::-1])
python 列表取子列表索引是左闭右开,最后应该是s = s[:k]?这样就去除了后置空格了