今天在刷题的过程看到一位大神写的代码

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ft272781150/article/details/70833027

题目描述
对字符串中的所有单词进行倒排。
说明:
1、每个单词是以26个大写或小写英文字母构成;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;

输入描述:
输入一行以空格来分隔的句子

输出描述:
输出句子的逆序

输入例子:
I am a student

输出例子:
student a am I

我的代码

#include <iostream>
#include <string>
using namespace std;

void func10(string str)
{
    int i;
    string temp;
    for (int i = 0; i < str.size(); ++i)
    {
        if (str[i] < 'A' || (str[i] > 'Z' && str[i] < 'a') || str[i] > 'z')
        {
            str[i] = ' ';
        }
    }

    while (str.size() > 0)
    {
        int pos = str.find_last_of(' ');
        if (pos == -1)
        {
            temp += str;
            break;
        }
        temp += str.substr(pos + 1);
        i = pos;
        if (str[i] == ' ')
        {
            temp += " ";
            while (str[i] == ' ')
            {
                --i;
            }
        }
        str = str.substr(0, i + 1);

    }
    cout << temp << endl;
}

int main()
{
    string str;
    while (getline(cin, str))
    {
        func10(str);
    }
    return 0;
}

大神代码

void deal(vector<string>&res,string& str, char delim = ' ') {
    stringstream ss;
    ss << str;
    string tmp;
    while (ss>>tmp) {
        res.push_back(tmp);
    }
}
int main() {
    string str;
    while (getline(cin, str)) {
        vector<string> res;
        for (int i = 0; i < str.size(); i++)
            if (!isalnum(str[i]))
                str[i] = ' ';
        deal(res, str);
        cout << res[res.size() - 1];
        for (int i = res.size() - 2; i >= 0; i--)
            cout << " " << res[i];
        cout << endl;
    }
    return 0;
}

巧妙的利用流提取符>>去掉多余的空格!
哎!自己要学的还有很多啊!

展开阅读全文

没有更多推荐了,返回首页