話說工作中算法用的真的多么??????
雖然工作中用不到,但是你總得換工作吧,防不住筆試面試中問你些這么個玩意。
而且,多思考,有助於活躍頭腦了。深深扎入項目中童鞋們還可以活躍活躍,防止生銹。
話不多說,題目如下:
題目:輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字符的順序不變。句子中單詞以空格符隔開。為簡單起見,標點符號和普通字母一樣處理。
例如輸入“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 }
這樣就搞定了