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),用 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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章