Leetcode刷题:剑指offer【面试题58-Ⅰ 翻转单词顺序】

【面试题58-Ⅰ 翻转单词顺序】

面试题58-Ⅰ:翻转单词顺序:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。

思路:先用 s.strip() 删除字符串的首尾空格,从后向前遍历字符串,根据空格判断单词,每遇到一个单词就将其 append 到 res 列表中,并判断是否为第一个单词,如果不是则继续 append 一个空格。

注意 append 空格需要满足:

  • 没有重复空格,也就是 s[i+1] 不是空格,s[i] 是空格才可以 append,如果 s[i+1] 已经是空格 append 过了,那么 s[i] 得空格就要跳过
  • 第一个单词前不需要加空格

时间复杂度 O ( n ) O(n) O(n),只需要单向遍历字符串一遍
空间复杂度 O ( n ) O(n) O(n),用 res 列表存储反向后的单词

class Solution:
    def reverseWords(self, s: str) -> str:
        s = s.strip()  # 去掉首尾空格
        i, res = len(s)-1, []
        while i >= 0:  # 从后向前遍历字符串
            if s[i] != ' ':
                j = i
                while i >= 0 and s[i] != ' ': i -= 1
                res.append(s[i+1:j+1])  # append单词
            # 判断当前是否为第一个单词或有重复空格
            if i != -1 and s[i+1] != ' ':
                res.append(' ')
            i -= 1
        return ''.join(res)

你可能感兴趣的:(今天刷题了吗)