剑指Offer面试题42
题目:
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字符一样处理。例如输入字符串”I am a student.”,则输出”student. a am I”。
思路一:把英文句子倒着输出可以把单词看做一个整体的进栈出栈情况处理。
通过扫描空格来确定每个单词的起始和终止位置。
class Solution {
public:
string ReverseSentence(string str)
{
stack<string> s;
string temp;
string result;
//每个单词依次进栈
for(int i= 0; i < str.size(); i++)
{
if(str[i] != ' ')
temp += str[i];
else
{
s.push(temp); //temp表示一个单词,单词进栈
temp.clear();
}
}
s.push(temp);
//依次出栈
while(!s.empty())
{
if(s.size() != 1) //判断是不是最后一个单词
{
result = result + s.top() + " "; //单词与单词之间有空格
}
else
result = result + s.top() ;//最后一个单词后面则没有空格
s.pop();
}
return result;
}
};
思路二:
1、先翻转句子中的所有字符。比如翻转”I am a student.”得到”.tneduts a ma I”。不仅翻转了句子中单词的顺序,连单词内的字符顺序也被反转了。
2、再翻转每个单词中的字符顺序。
class Solution {
public:
void Reverse(int begin,int end,string &str)
{
while(begin < end)
{
char temp = str[begin];
str[begin] = str[end];
str[end] = temp;
begin++;
end--;
}
}
string ReverseSentence(string str)
{
int len = str.length();
Reverse(0,len - 1,str);
int begin = 0;
int end = 0;
int i = 0;
while(i < len)
{
//把前面的空格都去掉
while(i < len && str[i] == ' ')
{
i++;
}
begin = end = i;
while(i < len && str[i] != ' ')
{
i++;
end++;
}
Reverse(begin,end - 1,str);
}
return str;
}
};