剑指offer58_反转单词顺序1
我觉得这个题利用string的rfind()以及append()、erase()结合来使用比较方便且利于理解,当然这可能并不是最优解,
输入:I have a phone
输出:phone a have I
这个题最开始做以为很简单,但后来我发现是我想多了,他需要适应的场景有很多,力扣上是这样描述的
所以要做到消除掉字符串头、尾的空格,以及对于字符串中两单词间对于的空格也要给予删除,保留一个即可。
代码如下:
#include <iostream>
#include <string>
using namespace std;
string reversewords(string s) {
string res;
int ret = 0, r = s.size();
//当字符串头存在空格给予清除
while (s[0] == ' ')
{
s.erase(0, 1);
}
//增加判断,排除空串情况
if (s.size() >= 1)
{
//当字符串尾部存在字符串给予清除
while (s[s.size() - 1] == ' ')
{
s.erase(s.size() - 1, 1);
}
}
//如果为空串或者size为1
if (s.size() == 0 || s.size() == 1)
{
return s;
}
int flag = 0, l = 0;
while (ret != -1)
{
l++; //利用l记录是否查找到字符串内空格,l == 1,不存在空格,即字符串无需反转
flag = ret;
ret = s.rfind(' ', r); //从右端开始查找
if (flag - ret == 1) //判断是否多个空格连在一起的情况
{
r--;
continue;
}
res.append(s, ret + 1, r - ret);
res += ' ';
r = ret - 1;
}
if (l == 1) //不存在空格,即字符串无需反转
{
return s;
}
else {
res.erase(res.size() - 1, 1); //将最后一个添加的空格去除
}
return res;
}
int main()
{
string s = "the sky is bule";
string ret = reversewords(s);
for (int i = 0; i < ret.size(); i++)
{
cout << ret[i];
}
return 0;
}