《剑指offer》【字符串翻转】(python版)

题目描述:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
思路:首先分析一下翻转之后句子的变化:句子每个单词顺序逆转,单词内部每个字母顺序不变。如果题目是将“a b c d”翻转为“d c b a”,那么问题很简单,只需要把整个字符串逆转即可。那如果是“ab cd”呢?字符串整体逆转后的结果是“dc ba”,为了将每个单词还原,还需要对每个单词进行逆转,得到“cd ab”。

class Solution:
    def ReverseSentence(self, s):
        # write code here
        # 将字符串转换为数组,每一个字符为一个元素
        listofs = list(s)
        if len(listofs) == 0:
            return s
        # 字符串整体翻转
        listofs = self.reverse(listofs)
        start = end = 0
        while end < len(listofs):
            # 对每个单词做翻转
            if listofs[end] == ' ':
                listofs[start:end] = self.reverse(listofs[start:end])
                start = end + 1
            end += 1
            # 最后一个单词单独提出
            if end == len(listofs) - 1:
                listofs[start:end + 1] = self.reverse(listofs[start:end + 1])
        return ''.join(listofs)


    def reverse(self, listofs):
        m = len(listofs)
        for i in range(m >> 1):
            listofs[i], listofs[m - 1 - i] = listofs[m - 1 - i], listofs[i]
        return listofs

在python中有更为简单的方式,直接把每个单词当做一个整体,对单词数组做逆转。

class Solution:
    def ReverseSentence(self, s):
        # write code here
        # 字符串过滤掉空格直接得到由每个单词构成的数组
        l=s.split(' ')
        # 数组逆序
        return ' '.join(l[::-1])

你可能感兴趣的:(字符串,剑指offer)