[面試算法題重做]翻轉句子中單詞的順序


話說工作中算法用的真的多么??????

雖然工作中用不到,但是你總得換工作吧,防不住筆試面試中問你些這么個玩意。

而且,多思考,有助於活躍頭腦了。深深扎入項目中童鞋們還可以活躍活躍,防止生銹。

話不多說,題目如下:

題目:輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字符的順序不變。句子中單詞以空格符隔開。為簡單起見,標點符號和普通字母一樣處理。

例如輸入“I am a student.”,則輸出“student. a am I”。

在何海濤的日記中,分析方法是

先顛倒句子中的所有字符。這時,不但翻轉了句子中單詞的順序,而且單詞內字符也被翻轉了。我們再顛倒每個單詞內的字符。由於單詞內的字符被翻轉兩次,因此順序仍然和輸入時的順序保持一致。

以上面的輸入為例子。翻轉“I am a student.”中所有字符得到“.tneduts a ma I”,再翻轉每個單詞中字符的順序得到“students. a am I”,正是符合要求的輸出。

這樣翻來覆去非常麻煩啊有木有,我們可以換個思路來,用棧和容器來實現:

棧實現思路:

循環語句查找空格,找到后將用空格分隔的單詞以此入棧,然后剩下的工作就是出棧就行了。

 1 void Reverse(const string& inStr) {
 2     stack<string> strStack;
 3     string temp;
 4     for (int i = 0; i < inStr.length(); ++i) {
 5         if(!isspace(inStr[i]))  {
 6             temp += inStr[i];
 7         } else {
 8             strStack.push(temp);
 9             temp = "";
10         }
11     }
12     // 這里壓入最后一個值
13     strStack.push(temp);
14    // 這里必須聲明變量,因為你在操作棧,size是變化的,一定要注意
15     int stackSize = strStack.size();
16     for (int i = 0; i < stackSize; i++) {
17         cout << strStack.top() << " "
18         strStack.pop();
19     }
20 }

容器實現思路:

同棧相似,先找出空格分隔的單詞后,將其以此放入容器,然后逆序輸出就行了

 1 void Reverse(const string& s) 
 2 { 
 3     string temp; 
 4     vector<string> result; 
 5     for(int i = 0; i < s.length(); ++i) 
 6     { 
 7         if(isspace(s[i])) 
 8         { 
 9             result.push_back(temp); 
10             temp = ""; 
11         } 
12         else 
13             temp += s[i]; 
14     } 
15     result.push_back(temp); 
16     for(int j = result.size()-1; j != -1; --j) 
17         cout<<result[j]<<" "; 
18     cout<<endl; 
19 }

這樣就搞定了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM