题目:
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
思路:
1.将字符串多余的空格除去(本题难点);
2.将去除空格和后的字符串翻转;
3.将单词挨个翻转,以空格为翻转标志。
#include<iostream>
#include <string.h>
using namespace std;
//理解代码需要注意空格的个数,删除完空格后,中间的还剩一个,前后没有
void reverse(string &s,int start,int end)
{
for (int i=start,j=end;i<j;i++,j--)
{
swap(s[i],s[j]);
}
}
void remove_spaces(string &s)
{
int slow=0,fast=0;
while (s.size()>0&&s[fast]==' '&&fast<s.size())//去除开头的空格
{
fast++;
}
for(fast;fast<s.size();fast++)//去除中间的空格,包括的空格(但还剩一个空格)
{
if(fast-1>0&&s[fast]==' '&&s[fast-1]==' ')
{
continue;
}
else
{
s[slow++]=s[fast];//s[slow]=s[fast];slow++;
}
}
if(slow-1>0&&s[slow-1]==' ')
{
s.resize(slow-1);
}
else
{
s.resize(slow);
}
}
int main()
{
string s;
cout<<"string: "<<endl;
getline(cin,s);
remove_spaces(s);//删除空格
reverse(s,0,s.size()-1);//翻转字符串
for(int i=0;i<s.size();i++)//每个单词翻转
{
int j=i;
while(j<s.size()&&s[j]!=' ')
{
j++;
}
reverse(s,i,j-1);
i=j;
}
cout<<"res: "<<s<<endl;
}
对于reverse函数,c++库中也有,但是其复杂度比较高,所以这里重写。
结果如下: