解题思路:首先这题可以用库函数等简便方法来做,但我还是不太熟练,因此这里采用双指针来做并且锻炼思维,在做这题之前可以做做用双指针移除数组中的元素
大体思路:对整个string进行翻转操作,再对每个单词单独反转一次便可得到答案
难点:该字符串中单词与单词之间有空格并且单词之前和之后也有空格,如果直接进行翻转操作会导致空格也被反转过去,所以要进行去空格
去空格做法:运用快慢指针,判断快指针指向的是否为空,然后赋给慢指针的指向位置,但是因为单词与单词之间是有一个空格的,所以用慢指针来给赋值空格,并且因为首单词前面是没有空格的,所以对首单词要特殊判断
翻转注意条件:翻转时候用一个指针遍历string判断它是否为空格与到了尾部,如果是的话就说明一个单词找完,要开始反转了。特别需要注意的是判断条件是fast<=s.size();因为要判断的是是否读完单词,所以要到单词的下一位置
代码实现如下:
class Solution {
public:
void reverse(string&s,int i,int j)
{
for(;i<j;i++,j--)
{
swap(s[i],s[j]);
}
}
void removeKong(string &s)
{
int fast=0;int slow=0;//定义快慢指针
for(;fast<s.size();++fast)//快指针开始移动
{
if(s[fast]!=' ')//但快指针不为空时
{
if(slow!=0){s[slow++]=' ';}//判断一下slow是不是指向首单词
while(fast<s.size()&&s[fast]!=' ')//循环赋值
{
s[slow++]=s[fast++];
}
}
}s.resize(slow);
}
string reverseWords(string &s)
{
removeKong(s);int start=0;
reverse(s,0,s.size()-1);
for(int i=0;i<=s.size();++i)
{
if(s[i]==' '||i==s.size())
{
reverse(s,start,i-1);
start=i+1;
}
}
return s;
}
};