剑指offer | 翻转单词顺序列 “格式错误”解决【C++】
题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
错误代码
string ReverseSentence(string str) {
string tmp = "";
stack<string> s;
for (int i = 0; i < str.length(); i++){
if (str[i] != ' '){
tmp += str[i];
}
if(str[i] == ' ' || i == str.length()- 1){
s.push(tmp);
tmp = "";
}
}
string res = "";
while(!s.empty()){
res += s.top();
if (s.size() > 1) //最后一个词语不需要加空格
res += ' ';
s.pop();
}
return res;
}
错误提示
搜索了一下发现,出现格式错误的可能原因之一是输出结果末尾多了一个字符串。前文代码通过if (s.size() > 1) res += ' ';
行去掉了末尾的空格,但仍然显示格式错误。
注释掉if (s.size()>1)
行,将会显示“答案错误”。可以看到除了末尾的空格,跟正确答案并没有差别。
解决方法
最后在讨论区看到有人碰到了相同的问题。结果真正的错误原因是由于没有额外判断全是空格的字符串:
int j = 0;
while (j < str.length() && str[j] == ' ')
j++;
if(j == str.length()) //如果全是空格,直接输出
return str;
正确代码
string ReverseSentence(string str) {
string tmp = "";
stack<string> s;
// 判断str是否全为空格
int j = 0;
while (j < str.length() && str[j] == ' ')
j++;
if(j == str.length())
return str;
for (int i = 0; i < str.length(); i++){
if (str[i] != ' '){
tmp += str[i];
}
if(str[i] == ' ' || i == str.length()- 1){
s.push(tmp);
tmp = "";
}
}
string res = "";
while(!s.empty()){
res += s.top();
if (s.size() > 1)
res += ' ';
s.pop();
}
return res;
}