面試題分享:一道常見的C++程序員面試題
如果以編程難度為標準,我認為這道題的難度應該是三顆星(五顆星為最高難度)。
難度不算很高,只需要掌握C++字符串操作和雙指針法即可完成。
同時,答案也比較簡單明了,代碼實現(xiàn)也非常直觀。但如果以面試考察范圍進行評估,因為該問題是C++基礎語法中的一個小問題,所以面試官可能會根據(jù)候選人的表現(xiàn)來定位其技能水平,并根據(jù)此為基礎提出更深入、更具挑戰(zhàn)性的問題。
問題:
請編寫一個函數(shù) reverseStr(string s),將字符串s反轉并返回。
例如,若輸入為 "hello world",則函數(shù)應返回 "dlrow olleh"。
要求使用 C++ 語言實現(xiàn),并盡可能優(yōu)化算法時間復雜度和空間復雜度。
樣例輸入輸出:
輸入: "hello world"
輸出: "dlrow olleh"
解題思路:
這道題可以采用雙指針法來實現(xiàn)字符串反轉。具體來說,我們定義兩個指針i和j,分別指向字符串s的首尾位置。然后交換i和j指向的字符,并將i和j向中間移動,直到它們相遇為止。
最后返回反轉后的字符串即可。
以下是示例代碼:
#include <iostream>
#include <string>
using namespace std;
string reverseStr(string s) { ??
????int i = 0, j = s.size() - 1; ?
?????while (i < j) { ? ? ??
????????swap(s[i], s[j]); ? ? ??
????????++i;
? ? ?? --j;
?? } ? ?return s;
} int main() {
?? string s = "hello world";
?? cout << reverseStr(s) << endl;
? // 輸出結果為:dlrow olleh
?? return 0;
}
以上代碼中,我們先定義了兩個指針i和j,初始時分別指向字符串s的首尾位置。然后在循環(huán)中,我們不斷交換i和j指向的字符,并將i和j向中間移動。當i和j相遇時,反轉結束。最后,我們將反轉后的字符串返回即可。
該算法的時間復雜度為O(n),其中n為字符串的長度,空間復雜度為O(1)。由于只需要對字符串進行一次遍歷,因此該算法的時間復雜度較低,適合處理大規(guī)模數(shù)據(jù)。
關注 微信公眾號:奇牛編程