C++中反轉(zhuǎn)字符串單詞字符順序的兩種方法
在 C++ 中,字符串處理是常見的面試與算法練習(xí)題。本題目標(biāo)是:反轉(zhuǎn)字符串中每個單詞的字符順序,但保持單詞順序不變。
示例:
輸入: "Hello World" 輸出: "olleH dlroW"
也就是說:
Hello → olleH World → dlroW
下面介紹 兩種經(jīng)典實現(xiàn)方法。
一、方法一:使用字符串流(stringstream)
利用 將字符串按單詞拆分,然后逐個反轉(zhuǎn)。
思路
- 使用
stringstream按空格分割單詞 - 使用
reverse()反轉(zhuǎn)單詞 - 拼接結(jié)果字符串
代碼實現(xiàn)
#include <iostream>
#include <sstream>
#include <algorithm>
using namespace std;
string reverseWords(string s) {
stringstream ss(s);
string word;
string result;
while (ss >> word) {
reverse(word.begin(), word.end());
result += word + " ";
}
result.pop_back();
return result;
}
int main() {
string str = "Hello World";
cout << reverseWords(str) << endl;
return 0;
}輸出:
olleH dlroW
時間復(fù)雜度
O(n)
空間復(fù)雜度:
O(n)
優(yōu)點:
- 代碼簡單
- 可讀性好
缺點:
- 使用額外空間
二、方法二:雙指針原地反轉(zhuǎn)
使用 雙指針掃描字符串,找到每個單詞的范圍并進行反轉(zhuǎn)。
思路
- 遍歷字符串
- 找到單詞起始位置
- 找到單詞結(jié)束位置
- 調(diào)用
reverse()反轉(zhuǎn)
代碼實現(xiàn)
#include <iostream>
#include <algorithm>
using namespace std;
string reverseWords(string s) {
int start = 0;
for (int i = 0; i <= s.size(); i++) {
if (i == s.size() || s[i] == ' ') {
reverse(s.begin() + start, s.begin() + i);
start = i + 1;
}
}
return s;
}
int main() {
string str = "Hello World";
cout << reverseWords(str) << endl;
return 0;
}
輸出:
olleH dlroW
時間復(fù)雜度
O(n)
空間復(fù)雜度:
O(1)
優(yōu)點:
- 原地操作
- 更節(jié)省內(nèi)存
缺點:
- 實現(xiàn)稍復(fù)雜
三、兩種方法對比
| 方法 | 思路 | 空間復(fù)雜度 | 適合場景 |
|---|---|---|---|
| stringstream | 拆分單詞再反轉(zhuǎn) | O(n) | 簡單實現(xiàn) |
| 雙指針 | 原地掃描 | O(1) | 面試優(yōu)化 |
四、進階問題(面試常問)
很多面試會繼續(xù)延伸:
1 反轉(zhuǎn)單詞順序
例如:
"Hello World" → "World Hello"
2 去除多余空格
例如:
" hello world " → "world hello"
3 整個字符串反轉(zhuǎn) + 單詞反轉(zhuǎn)
經(jīng)典算法:
1 先整體反轉(zhuǎn) 2 再逐個單詞反轉(zhuǎn)
該題在很多算法平臺都有類似題目,例如:
- LeetCode
五、總結(jié)
反轉(zhuǎn)字符串中單詞字符順序的核心方法:
1?? 使用 字符串流分割單詞
2?? 使用 雙指針原地反轉(zhuǎn)
關(guān)鍵函數(shù):
reverse()
以上就是C++中反轉(zhuǎn)字符串單詞字符順序的兩種方法的詳細內(nèi)容,更多關(guān)于C++反轉(zhuǎn)字符串單詞字符順序的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
用pybind11封裝C++實現(xiàn)的函數(shù)庫的方法示例
這篇文章主要介紹了用pybind11封裝C++實現(xiàn)的函數(shù)庫,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
C語言結(jié)構(gòu)體成員賦值的深拷貝與淺拷貝詳解
C語言中的淺拷貝是指在拷貝過程中,對于指針型成員變量只拷貝指針本身,而不拷貝指針?biāo)赶虻哪繕?biāo),它按字節(jié)復(fù)制的。深拷貝除了拷貝其成員本身的值之外,還拷貝成員指向的動態(tài)內(nèi)存區(qū)域內(nèi)容。本文將通過示例和大家詳細說說C語言的深拷貝與淺拷貝,希望對你有所幫助2022-09-09
C++課程設(shè)計之學(xué)生成績管理系統(tǒng)
這篇文章主要為大家詳細介紹了C++課程設(shè)計之學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-12-12
詳解VS2019使用scanf()函數(shù)報錯的解決方法
本文主要介紹了詳解VS2019使用scanf()函數(shù)報錯的解決方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
MinGW-w64 C/C++編譯器下載和安裝的方法步驟(入門教程)
如果電腦沒有安裝MinGW-w64 C/C++編譯器,就無法運行g(shù)cc命令,本文主要介紹了MinGW-w64 C/C++編譯器下載和安裝的方法步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02

