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;
}