剑指Offer 44. 翻转单词顺序列 (字符串)

Posted on 2018-10-16 12:43  _hqc  阅读(131)  评论(0编辑  收藏  举报

题目描述

牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

题目地址

https://www.nowcoder.com/practice/3194a4f4cf814f63919d0790578d51f3?tpId=13&tqId=11197&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路

思路1:分割成列表,然后对列表翻转,返回合并的字符串。

思路2:先翻转整个字符串,然后翻转每个单词,用两个指针记录每个单词的开始和结尾的位置。遇到 ' ' 说明单词的结尾,需要调节指针。

另外需要注意的是,字符串不能直接修改,需要转成list之后才能直接对每一位进行修改。

Python

# -*- coding:utf-8 -*-
class Solution:
    def ReverseSentence(self, s):
        # write code here
        if not s:
            return s
        # 思路1
        # s = s.split(' ')
        # s.reverse()
        # return " ".join(s)
        # 思路2:
        s = list(s)
        self.reverse(s, 0, len(s)-1)
        start,end = 0,0
        while start < len(s):
            if s[start] == ' ':
                start += 1
                end += 1
            elif end == len(s) or s[end] == ' ':

                self.reverse(s,start ,end -1)
                end += 1
                start = end
            else:
                end += 1
        return ''.join(s)
    def reverse(self,s,start,end):
        while start < end:
            s[start],s[end] = s[end],s[start]
            start += 1
            end -= 1

if __name__ == '__main__':
    result = Solution().ReverseSentence('student. a am I')
    print(result)