#方法一:使用库函数split
# class Solution:
# def reverseWords(self, s):
# # 反转整个字符串
# s = s[::-1]
# # 将字符串拆分为单词,并反转每个单词
# # split()函数能够自动忽略多余的空白字符
# #' '.join()可以实现,加入的元素之间有一个空格
# s = ' '.join(word[::-1] for word in s.split())
# return s
#方法二:使用双指针
#这种方法的思路与第一种不同,这是将每一个单词都当作一个元素来直接反转
# class Solution:
# def reverseWords(self, s):
# # 将字符串拆分为单词,即转换成列表类型
# words = s.split()
# # 反转单词
# left, right = 0, len(words) - 1
# while left < right:
# words[left], words[right] = words[right], words[left]
# left += 1
# right -= 1
# # 将列表拼接成字符串
# return " ".join(words)
#方法三:拆分字符串+反转列表
# class Solution:
# def reverseWords(self, s):
# words = s.split() #type(words) --- list
# words = words[::-1] # 反转单词
# return ' '.join(words) #列表转换成字符串
#方法四:将字符串转换为列表后,使用双指针去除空
class Solution:
#首先定义一个反转数列中,从start到end字符的函数
def reverse(self,s, start, end):
while start < end:
s[start], s[end] = s[end], s[start]
start += 1
end -= 1
return s
#使用快慢指针的方式,去除掉所有空格并在相邻单词之间添加空格
def removeExtraSpace(self,s):
slow,fast=0,0
while fast<len(s):
if s[fast]!=' ':#只有遇到非空格才进行处理,即删除所有空格
if slow!=0 and slow<len(s):
#注意,进到下面这个判断说明已经跳出了后面的while,也就是说一个word被读完了,需要加空格了
s[slow]=' '
slow+=1
while fast<len(s) and s[fast]!=' ' and slow<len(s):
s[slow]=s[fast]
slow+=1
fast+=1
else:
fast+=1
#下面这一步的返回非常重要,如果直接返回s,那么会多出很多空余的空格,使得结果出错
return s[:slow]#将处理后的列表裁剪为仅包含实际需要的字符长度,去除未使用或多余的字符
def reverseWords(self,s):
s=list(s)
s=self.removeExtraSpace(s)
s=self.reverse(s,0,len(s)-1)
start=0
for i in range(0,len(s)+1):
#到达空格或者串尾,说明一个单词结束,该要反转了
if i==len(s) or s[i]==' ':
self.reverse(s,start,i-1)
start=i+1
return "".join(s)
# def reverseWords(self, s):
# result = ""
# fast = 0
# # 1. 首先将原字符串反转并且除掉空格, 并且加入到新的字符串当中
# # 由于Python字符串的不可变性,因此只能转换为列表进行处理
# s = list(s)
# s.reverse()
# while fast < len(s):
# if s[fast] != " ":
# if len(result) != 0:
# result += " "
# while s[fast] != " " and fast < len(s):
# result += s[fast]
# fast += 1
# else:
# fast += 1
# # 2.其次将每个单词进行翻转操作
# slow = 0
# fast = 0
# result = list(result)
# while fast <= len(result):
# if fast == len(result) or result[fast] == " ":
# self.single_reverse(result, slow, fast - 1)
# slow = fast + 1
# fast += 1
# else:
# fast += 1
# return "".join(result)
#方法五:遇到空格说明前面是一个单词,把它放到一个数组中
#这种方法就是挨个遍历字符串中的字母,如果连续非0,就收集到word中,当遇到空格的时候,就说明一个word收集完了,就可以给到words中储存,最后对words统一颠倒,返回值加空格就可以了
class Solution:
def reverseWords(self,s):
words=[]
word=''#word的数据类型是字符串
#由于是先找到空格,再去判断前面是否收集到单词,所以如果最后一位没有空格的话,就会漏掉最后一个单词,因此需要在末尾手动添加一个空格
s+=' '
for char in s:
if char==' ':#遇到空格就说明前面的可能是一个单词
if word!='':#确认是单词,把它加入到一个数组中
words.append(word)
word=''#清空当前单词
continue
word+=char#收集单词的字母
words.reverse()
return ' '.join(words)
03-14
960
