給定字符串 s,按單詞反轉順序。單詞由空格分隔,可能包含多餘空格。輸出單詞間單個空格,首尾無空格。例:"the sky is blue" → "blue is sky the"。
三步走策略:
class Solution {
public:
void reverseWords(string &s) {
// 1. 整體反轉
reverse(s.begin(), s.end());
// 2. 逐詞反轉 + 3. 雙指針清理空格
int n = s.size(), write = 0, read = 0;
while (read < n) {
// 跳過空格
while (read < n && s[read] == ' ') ++read;
if (read >= n) break;
// 寫入單詞前加空格(非首詞)
if (write > 0) s[write++] = ' ';
// 記錄單詞起點,拷貝並反轉
int start = write;
while (read < n && s[read] != ' ') s[write++] = s[read++];
reverse(s.begin() + start, s.begin() + write);
}
// 截斷尾部殘留
s.resize(write);
}
};
| 步驟 | 目的 | 技巧 |
|---|---|---|
| 整體反轉 | 單詞順序倒置,但字符也倒了 | reverse(begin, end) |
| 逐詞反轉 | 恢復單詞內部字符順序 | 雙指針定界單詞區間 |
| 清理空格 | 合併多空格、去首尾空格 | 讀寫指針分離,原地覆蓋 |
void reverseWords(string &s) {
stringstream ss(s);
string word, res;
vector words;
while (ss >> word) words.push_back(word);
for (int i = words.size()-1; i >= 0; --i) {
if (i != words.size()-1) res += ' ';
res += words[i];
}
s = res;
}
// Java
s = String.join(" ", Arrays.asList(s.trim().split("\\s+"))).reverse(); // 需自行實現反轉
// 或
List list = Arrays.asList(s.trim().split("\\s+"));
Collections.reverse(list);
s = String.join(" ", list);
# Python 一行解決 s = ' '.join(reversed(s.split()))
string::resize 截斷尾部垃圾字符