题目描述:
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
这道题我想到两种方法:
1、从后往前遍历字符串,以空格分割,找到每个单词,然后再遍历每个单词,将单词逐个链到新字符串上,注意需要将第一个单词单独处理,具体代码如下:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
getline(cin, str);
string newstr = "";
int i = str.size() - 1;
int j;
while (i >= 0)
{
if (str[i] == ' ')
{
//从后往前链每一个单词
j = i + 1;
while (str[j] != ' ' && j < str.size())
{
newstr += str[j];
j++;
}
newstr += ' ';
}
i--;
//遍历到第一个单词
if (i == 0)
{
int temp = i;
while (str[temp] != ' ' && temp < str.size())
{
newstr += str[temp];
temp++;
}
}
}
cout << newstr;
return 0
这种方法思路清楚,但是较为冗余,容易漏掉一些情况,我第一次写的时候,就漏掉了第一个单词只有一个字符的情况,思路虽然简单,但是需要逻辑非常缜密。
2、利用算法中的逆置,先把整个字符串逆置,再对以空格分隔的单个单词进行逆置,具体代码如下:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string str;
getline(cin,str);
reverse(str.begin(),str.end());
auto start=str.begin();
while(start!=str.end())
{
auto end=start;
//遍历以空格分隔的单词,注意对end解引用取到值
while(end!=str.end() && *end!=' ')
end++;
//逆置单个单词
reverse(start,end);
if(end!=str.end())
{
//每个单词的开始
start=end+1;
}
else
start=end;
}
cout<<str;
return 0;
}