Reverse Words in a String
方法一:用堆栈做的,比较麻烦,思想是在字符串中提取各个单词,然后放在栈中,然后再一个一个的弹出来就OK了。执行时间是88ms。
#include <iostream> #include<stack> #include<string> using namespace std; class Solution { public: void reverseWords(string &s) { stack<string> st; int k=0; for(int i=0;i<s.size()+1;i++) { int j=0; if(s[i] ==' '|| s[i]=='\0') { j=i; while(s[++i]==' '); i--; string tmp=""; for(int t=k;t<j;t++) { string z=" "; z[0]=s[t]; tmp += z; } st.push(tmp); k=i+1; } } string tmp2=""; while(st.size()) { if(st.top()!="") {tmp2 += st.top(); tmp2+=" ";} st.pop(); } s=tmp2; if(s.size()) s.resize(s.size()-1); for(int i=0;i<s.length();i++) cout<<s[i]<<endl; } }; int main() { Solution s ; string a="za"; s.reverseWords(a); cout<<"a"<<a<<"b"; }
方法二:经大神指导,换个思路,首先这个字符串收尾对调(“the sky is blue ”变为“eulb si yks eht”),然后再遍历字符串,将每个单词对调。执行时间是48ms。
1 #include <iostream> 2 #include<stack> 3 #include<string> 4 5 6 using namespace std; 7 8 class Solution { 9 public: 10 void reverseWords(string &s) { 11 int k=0; 12 while(s[s.size()-1]==' ') 13 s.resize(s.size()-1); 14 15 swap(s,0,s.size()); 16 17 while(s[s.size()-1]==' ') 18 s.resize(s.size()-1); 19 20 for(int i=0;i<s.size()+1;i++) 21 { 22 if(s[i]==' ' || s[i] == '\0') 23 { 24 swap(s,k,i); 25 while(s[++i]==' ') 26 { 27 s=s.replace(i,1,""); 28 i--; 29 } 30 31 k=i--; 32 33 } 34 } 35 } 36 void swap(string &s,int k,int j) 37 { 38 int count=j-k; 39 for(int i=0;i<(count+1)/2;i++) 40 { 41 char tmp; 42 tmp=s[k]; 43 s[k]=s[j-1]; 44 s[j-1]=tmp; 45 k++; 46 j--; 47 } 48 } 49 }; 50 int main() 51 { 52 Solution s ; 53 string a="1 1"; 54 s.reverseWords(a); 55 cout<<"a"<<a<<"b"; 56 }
方法三:将字符串转换为字符串流,然后再反转,只不过效率比较低。感兴趣的可以自己尝试。