题目:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
方法一分析:我们可以先把整个字符串给反转一遍,在从头到尾把每个单词反转一遍,凡是碰到空格就跳过去。题目不难但是我们要看清题目要求,没有说连续的空格只保留一个或开头、末尾不能是空格之类的,否则我们发现代码总是不能通过。
程序:
void Reverse(string& str, int begin, int end){ //反转str的begin和end区间内的字符;
while (begin < end)
swap(str[begin++], str[end--]);
}
string ReverseSentence(string str)
{
if (str.size()<=1)
return str;
Reverse(str, 0, str.size()-1); //整个字符串取反;
int begin = 0, end = 0;
while (end<=str.size())
{
if (str[begin] == ' ') //begin指向单词的第一个字符停止;
{
begin++;
end++;
}
else if (str[end] == ' ' ||str[end] == '\0' ) {//end指向单词的最后一个字符的下一个停止;
Reverse(str, begin, end-1);
begin = ++end;
}
else end++;
}
return str;
}
方法二分析:我们可以从头到尾遍历字符串,碰到空格就插入到结果的最前面,碰到单词就按顺序先保存到一个字符串中,单词完了同样把字符串插入到结果的最前面。
程序:
string ReverseSentence(string str) {
if (str.size() <= 1) return str; //字符串为空或只有一个字符,直接返回;
string s = ""; //保存最终的结果;
while (!str.empty()){
string t = "";
while (!str.empty() && str[0] == ' ') {
s.insert(s.begin(),' '); //是空格直接插入到s的最前面;
str.erase(str.begin());
}
while (!str.empty() && str[0] != ' ') {
t.push_back(str[0]); //把单词按顺序保存到t中;
str.erase(str.begin());
}
s = t + s; //单词插入到s的前面;
}
return s;
}