原地翻转句子中单词的顺序,但单词内字符的顺序不变。要求:空间复杂度O(1),时间复杂度O(n)。
比较好的思路就是整体翻转字符串,然后在翻转单词
#include <iostream>
#include <string>
using namespace std;
void reverse_word(string& word,int start,int end)
{
if (word.empty())
{
return;
}
while (start < end)
{
char temp = word[start];
word[start] = word[end];
word[end]= temp;
start++,end--;
}
return;
}
void reverse_sentense(string& sentense)
{
reverse_word(sentense,0,sentense.length()-1);
//cout<<a_temp<<endl;
int start=0,end;
//提取每一个空格,对分开的word进行逆序处理
for (int i=0;i<sentense.length();i++)
{
//a_temp+=sentense[sentense.length()-i-1];
if (sentense[i] == ' ' ) //检查到 空格或者到达了末尾
{
end = i;
reverse_word(sentense,start,end-1);
start = i+1;
}
if (i == sentense.length()-1 )
{
end = i;
reverse_word(sentense,start,end);
start = i+1;
}
}
return;
}
void main()
{
string word;
getline(cin,word);
reverse_sentense(word);
cout<<word<<endl;
return;
}
另外有一个写法就是,使用到了vector容器操作
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main(){
vector<string> store;
string in;
cin>>in;
store.push_back(in);
while (cin.get() != '\n')
{
cin >> in;
store.push_back(in);
}
for(auto c=store.end();c!=store.begin();)
cout<<*(--c)<<' ';
return 0;
}
最后一个就是老老实实对没一个字符进行判断,但是明显空间复杂度就达不到要求。