3. LCR 181. 字符串中的单词反转

题目描述:

你在与一位习惯从右往左阅读的朋友发消息,他发出的文字顺序都与正常相反但单词内容正确,为了和他顺利交流你决定写一个转换程序,把他所发的消息 message 转换为正常语序。

注意:输入字符串 message 中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

我写的版本:

class Solution:
    def reverseMessage(self, message: str) -> str:
        nlist = []
        nlist[:] = message.split(" ")
        while '' in nlist:
            nlist.remove('')
        for i in range(len(nlist)//2):     
            nlist[i], nlist[-(i+1)] = nlist[-(i+1)], nlist[i]
        return " ".join(nlist)

网友题解:split()可把多个空格看作一个空格。

class Solution:
    def reverseMessage(self, message: str) -> str:
        return ' '.join(message.strip().split()[::-1])

解法2:双指针

class Solution:
    def reverseMessage(self, message: str) -> str:
        message = message.strip()                      # 删除首尾空格
        i = j = len(message) - 1
        res = []
        while i >= 0:
            while i >= 0 and message[i] != ' ': i -= 1 # 搜索首个空格
            res.append(message[i + 1: j + 1])          # 添加单词
            while i >= 0 and message[i] == ' ': i -= 1 # 跳过单词间空格
            j = i                                      # j 指向下个单词的尾字符
        return ' '.join(res)                           # 拼接并返回

作者:Krahets

这种解法思路为:先strip()去除字符串首尾空格,i、j初始化为字符串最后一个字符索引,初始化一个新列表用来存放单词,while i >=0:表示会从后到前一直遍历,while i >= 0 and message[i] != ' ': i -= 1表示i会向前移动直到遇到空格,res.append(message[i + 1: j + 1])表示会从空格后(单词第一个字符)开始到最后一个字符,j+1取不到,取的是j,刚好截取完整单词。while i >=0 and message[i] == ' ': i -= 1     j = i表示向前移动跳过空格直到遇到下一个单词最后一个字符,j=i表示让j指向下一个单词最后一个字符,开始下一轮截取单词。

 

阅读剩余
THE END