Reverse Words in a String

題目描述

給定字串 s,反轉其中所有單字的順序。單字之間用單一空格分隔,去除前後多餘空格。

輸入:s = "the sky is blue"
輸出:"blue is sky the"

輸入:s = "  hello world  "
輸出:"world hello"

輸入:s = "a good   example"
輸出:"example good a"

解題思路

1

去除前後空格

呼叫 trim/strip 移除首尾空白字元

2

分割單字

用正則 /\s+/ 或語言內建 split 按連續空格分割,自動過濾空字串

3

反轉陣列

對單字陣列呼叫 reverse() 或用 [::-1] 翻轉順序

4

重新拼接

用 " ".join() 或 string.Join(" ") 以單一空格連接所有單字

程式碼

C#

csharp
public class Solution {
    public string ReverseWords(string s) {
        // 分割 + 過濾空字串 + 反轉 + 拼接
        var words = s.Split(' ', StringSplitOptions.RemoveEmptyEntries);
        Array.Reverse(words);
        return string.Join(" ", words);
    }
}

TypeScript

typescript
function reverseWords(s: string): string {
    return s
        .trim()
        .split(/\s+/)  // 正則處理多個空格
        .reverse()
        .join(" ");
}

Python

python
def reverseWords(s: str) -> str:
    # split() 不帶參數會自動處理多個空格和首尾空格
    return " ".join(s.split()[::-1])

複雜度分析

| | Time | Space | |--|------|-------| | 本解法 | O(n) | O(n) |

分割需要掃描整個字串 O(n),反轉單字陣列 O(單字數) ≤ O(n),拼接 O(n),合計 O(n)。空間上,存儲所有單字需要 O(n)。

邊界情況

圖解

" hello world "
split + trim
["hello", "world"]
反轉
["world", "hello"]
join
"world hello"

圖表展示三步流程:原始字串有前後空格和兩個單字,split 後得到乾淨的單字陣列,反轉順序後用單一空格 join,多餘空格全部消除。

進階觀點

💡面試追問

  • Q: O(1) 額外空間怎麼做? A: 先反轉整個字串("eulb si yks eht"),再逐一反轉每個單字("blue is sky the")。這是經典的「兩次反轉」技巧,但只在 C/C++ 等支援 mutable 字串的語言中才能真正做到 O(1) 空間。Java/Python/C# 的字串不可變,底層一定會配置新空間。

  • Q: 如果要保留原始空格數量? A: 不能用 split,需要手動用雙指針從兩端往中間掃描單字,逐一交換。額外用一個陣列或指針記錄每段空格的長度,交換單字後按原始空格數量插入。

  • Q: 跟 Stack 的關係? A: 把每個單字依序 push 進 Stack,再全部 pop 出來,自然得到反轉順序。Stack 的 LIFO 特性本質上就是反轉操作,時空複雜度與 split + reverse 相同。

理解測驗

🤔 為什麼 Python 的 split() 不帶參數就能處理多個空格?

🤔 「先反轉整個字串,再反轉每個單字」為什麼能達到反轉單字順序的效果?

你可能也想看

345. Reverse Vowels of a String238. Product of Array Except Self

按 ← → 鍵切換課程