【20250124】字符串:151.反转字符串中的单词

#方法一:使用库函数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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

J17863153320

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值