题目
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。
示例:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括
思路
双指针法,两个指针而分别用来定位每个单词的首尾位置。
因为需要翻转,所以从字符串的右边开始往左遍历。
初始时,指针 i 和指针 j 位于字符串的末尾。
指针 i 开始往左遍历,直到遇到第一个空格,停下来,此时指针 i 和 j 记录着我们找到的第一个单词的首尾位置,将当前单词加入结果列表中。然后将 j 移动到 i 的位置,重复前面的操作。
循环结束的条件是,指针 i 遍历到字符串的第一个字符。
代码
class Solution:
def reverseWords(self, s: str) -> str:
s = s.strip()
i = j = len(s)-1
res = []
while i>=0:
while i>=0 and s[i]!=' ': i-=1
res.append(s[i+1:j+1])
while i>=0 and s[i]==' ': i-=1
j=i
return ' '.join(res)
复杂度
时间复杂度 O(N)
空间复杂度 O(N)
知识点
1、Python中 strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
2、join():连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串
seq = ['I','am','a','student']
print(' '.join(seq))
I am a student
print(':'.join(seq))
I:am:a:student