洛谷 B3640 T3 句子反转

发布时间 2023-08-04 11:16:10作者: sleepwind

题目描述

给定一行句子,每个词之间用空格隔开,要么是全小写英文单词,要么是全大写英文单词,要么是自然数。

要求将这些单词倒序输出。而且对于每个单词,如果是小写词,应当转为大写;如果是大写词,应当转为小写;如果是自然数,应该倒转输出。

分析

这道题可以getline按行输入,然后倒序遍历处理

按照空格判断一个单词,再根据题意进行处理。注意空格的问题

代码

#include <bits/stdc++.h>

using namespace std;

int a;
string c, s;

int main() {
    getline(cin, s);
    s = ' '+s;//防止检测不到最后的单词
    for (int i=s.length()-1; i>=0; i--) {
        if (s[i]==' ') {
            c=s.substr(i);
            if (c[1]>='a'&&c[1]<='z')
                for (int j=1; j<c.length(); j++)
                    c[j]-='a'-'A';
            else if (c[1]>='A'&&c[1]<='Z')
                for (int j=1; j<c.length(); j++)
                    c[j]+='a'-'A';
            else {
                c=c.substr(1,c.length()-1);
                c+=' ';
                reverse(c.begin(), c.end());
            }
            if (a==0&&++a) c=c.substr(1,c.length()-1);//注意输出时第一个单词不带空格
            cout << c;
            s=s.substr(0,i);
        }
    }
    return 0;
}