题目:
Given an input string, reverse the string word by word.
For example,
Given s = "the sky is blue",
return "blue is sky the".
我们首先要考虑几个特殊情况:
if(s[i] != ' ') //字符比较 空格是' '
{
tmp += s[i];
}
else
{
//如果tmp为空,说明还没有添加单词 有前导空格,不需要tag来判断
if(!tmp.empty())
{
stk.push(tmp);
tmp.clear();
}
}2. 我们需要区分两种情况,如果字符串有后导空格,最后一个单词会被压栈,但是如果没有,最后一个单词还保留在tmp中,所以我们需要判断是否压栈。 //如果字符串末尾没有空格,最后一个单词就还没有push进stk 需要判断
if(!tmp.empty())
stk.push(tmp);3. 我们出栈,输出单词时,需要区分前n-1个单词和最后一个单词,最后一个单词出栈后不加空格。要分开处理。s.clear();
while(stk.size() > 1)
{
s += stk.top();
stk.pop();
s += " ";
}
//最后一个单词处理后不加空格 需要单独处理
if(!stk.empty())
{
s += stk.top();
stk.pop();
}4. 比较时,必须类型匹配。字符空格 ‘ ’if(s[i] != ' ') //字符比较 空格是' '这道题难度并不是很大,但是考察面试者的思维严密性,是否能把情况考虑全面。
class Solution {
public:
void reverseWords(string &s) {
if(s.size() == 0) return;
string tmp;
stack<string> stk;
for(int i = 0; i < s.size(); i++)
{
if(s[i] != ' ') //字符比较 空格是' '
{
tmp += s[i];
}
else
{
//如果tmp为空,说明还没有添加单词 有前导空格,不需要tag来判断
if(!tmp.empty())
{
stk.push(tmp);
tmp.clear();
}
}
}
//如果字符串末尾没有空格,最后一个单词就还没有push进stk 需要判断
if(!tmp.empty())
stk.push(tmp);
s.clear();
while(stk.size() > 1)
{
s += stk.top();
stk.pop();
s += " ";
}
//最后一个单词处理后不加空格 需要单独处理
if(!stk.empty())
{
s += stk.top();
stk.pop();
}
return;
}
};s = result.substr(0,result.size()-1) ;2. 只有在当前坐标在pos前面,并且此时为空格时,才添加单词。
if (s[i] == ' '){
if (i > pos )
result = s.substr(pos,i-pos)+ " " + result ;3. 我们可以使用这种构造字符串的方式,形成反转。每次把之前得到的字符串放到后面。result = s.substr(pos,i-pos)+ " " + result ;4. 注意处理当没有后导空格时,我们要单独计算最后一个单词的长度。
result = s.substr(pos,s.size()-pos)+" "+result;
class Solution {
public:
void reverseWords(string &s) {
if(s.size() == 0) return;
string result;
int pos = 0;
for(int i = 0; i < s.size(); i++)
{
if(s[i] == ' ')
{
if(i > pos)
{
result = s.substr(pos, i-pos) + " " + result;
}
pos = i + 1;
}
else if(i == s.size()-1)
{
result = s.substr(pos, s.size()-pos) + " " + result;
}
}
s = result.substr(0, result.size()-1);
}
};[C++]LeetCode: 107 Reverse Words in a String (2014腾讯实习笔试题)
原文:http://blog.csdn.net/cinderella_niu/article/details/42834785