洛谷 T3 句子反转题解

本文介绍了如何使用C语言编写一个程序,接收一行全小写或全大写的英文单词及自然数组成的句子,按照单词倒序输出,并根据单词类型进行大小写转换和数字逆序。
摘要由CSDN通过智能技术生成

T3 句子反转

题目背景

请尽量在 30min 之内写完题目。这是指「写代码」的时间;「读题」时间不计算在内。

题目描述

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

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

举一个例子:

we choose TO go 2 the 123 moon

程序应当输出:

MOON 321 THE 2 GO to CHOOSE WE

输入格式

仅一行,即需要反转的句子。

输出格式

仅一行,表示程序对句子的处理结果。

样例 #1

样例输入 #1

we choose TO go 2 the 123 moon

样例输出 #1

MOON 321 THE 2 GO to CHOOSE WE

提示

样例解释

首先应当按单词逆序,即:

moon 123 the 2 go TO choose we

小写变大写、大写变小写、倒转自然数之后,得到最终结果:

MOON 321 THE 2 GO to CHOOSE WE
数据规模与约定

对于 100 % 100\% 100% 的数据,句子中包含的单词数量不超过 1000 1000 1000,每个单词长度不超过 6 6 6

code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reverse(char *str, int start, int end){
    char *p1 = &str[start];
    char *p2 = &str[end];
    while(p1 <= p2){
        char temp = *p1;
        *p1 = *p2;
        *p2 = temp;
        p1++;
        p2--;
    }
}
void Print(char *str, int size){
    for(int i = 0; i< size; ++i){
        printf("%c",str[i]);
    }
}
void ReverseWord(char *str, int size){
    int fast = 0;
    int slow = 0;
    for(fast = 0; fast < size; ++fast){
        if(str[fast] == ' '){
            reverse(str, slow, fast - 1);
            slow = fast + 1;
        }
    }
    reverse(str, slow, fast - 1);
}
void Transfrom(char *str, int size){
    for(int i = 0; i < size; ++i){
        if(str[i] <= 'z' && str[i] >= 'a'){
            str[i] = str[i] - 32; 
        }
        else if(str[i] <= 'Z' && str[i] >= 'A'){
            str[i] = str[i] + 32;
        }
    }
}
void ReverseNum(char *str, int size) {
    int start = -1;
    int end = -1;
    for (int i = 0; i < size; ++i) {
        if (str[i] >= '0' && str[i] <= '9' && (i == 0 || (str[i - 1] < '0' || str[i - 1] > '9'))) {
            start = i;
        }
        if (str[i] >= '0' && str[i] <= '9' && (i == size - 1 || (str[i + 1] < '0' || str[i + 1] > '9'))) {
            end = i;
        }
        if (start != -1 && end != -1) {
            reverse(str, start, end);
            start = -1;
            end = -1;
        }
    }
}
int main()
{
    char str[10000];
    gets(str);
    int size = strlen(str);
    int start = 0;
    int end = size - 1;
    reverse(str, start, end);
    ReverseWord(str, size);
    Transfrom(str, size);
    ReverseNum(str, size);
    Print(str, size);
    return 0;
}

字符串基础问题 洛谷

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值