题目要求:
Given an input string, reverse the string word by word.
For example,
Given s = "the sky is blue
",
return "blue is sky the
".
分析:
初步分析,有两种思路:
1、采用剑指offer中所讲的两次翻转字符串解法,先将整个字符串翻转一次,再对每个单词翻转一次。
2、遍历字符串,将单词抠出来拼接成目标串dest,具体是每抠出一个单词串temp,拼接在原有目标串前面,即dest=temp+' '+dest;
本人采用思路一完成代码,此题虽然不难,但还是错了好几次,主要是特例情况考虑不周,如情况:
s=" "
s=" a "
代码:
#include <iostream>
#include<string>
using namespace std;
class Solution {
public:
void reverseWords(string &s) {
if(!s.empty())
{
int n=s.size()-1;
int high=0;
int low=0;
bool sign=true;
reverse_range(s,0,n);
while(high<=n)
{
if(s[high]!=' ')
{
if(high==n)
{
reverse_range(s,low,n);
}
high++;
sign=false;
}
else
{
if(sign==false)
{
reverse_range(s,low,high-1);
high++;
low=high;
sign=true;
}
else
{
s.erase(high,1);
n--;
}
}
}
if(s[n]==' ')
{
s.erase(n,1);
n--;
}
}
}
void reverse_range(string &s,int low,int high)
{
char tmp=NULL;
while(low<high)
{
tmp=s[low];
s[low]=s[high];
s[high]=tmp;
low++;
high--;
}
}
};
void main()
{
string src=" this is a test ";
Solution s;
s.reverseWords(src);
cout<<src<<endl;
getchar();
}