剑指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;
}
posted @ 2020-09-20 20:10  Ueeei  阅读(156)  评论(0编辑  收藏  举报