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"
解題思路
去除前後空格
呼叫 trim/strip 移除首尾空白字元
分割單字
用正則 /\s+/ 或語言內建 split 按連續空格分割,自動過濾空字串
反轉陣列
對單字陣列呼叫 reverse() 或用 [::-1] 翻轉順序
重新拼接
用 " ".join() 或 string.Join(" ") 以單一空格連接所有單字
程式碼
C#
public class Solution {
public string ReverseWords(string s) {
// 分割 + 過濾空字串 + 反轉 + 拼接
var words = s.Split(' ', StringSplitOptions.RemoveEmptyEntries);
Array.Reverse(words);
return string.Join(" ", words);
}
}TypeScript
function reverseWords(s: string): string {
return s
.trim()
.split(/\s+/) // 正則處理多個空格
.reverse()
.join(" ");
}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 ",trim 後只剩一個單字,回傳"hello" - 只有一個單字:反轉後不變,直接回傳原單字
- 字間有多個空格:例如
"a b",split 需要正確處理連續空格,避免產生空字串
圖解
圖表展示三步流程:原始字串有前後空格和兩個單字,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() 不帶參數就能處理多個空格?
🤔 「先反轉整個字串,再反轉每個單字」為什麼能達到反轉單字順序的效果?