1.问题描述
对于一个长度为 n 字符串,我们需要对它做一些变形。
首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。
比如"Hello World"变形后就变成了"wORLD hELLO"。
数据范围: , 字符串中包括大写英文字母、小写英文字母、空格。
进阶:空间复杂度 , 时间复杂度
2.源码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
char *trans(char *s, int n)
{
int i, j, k, w = 0, u;
char *r = NULL;
if(s == NULL || n == 0)
{
return NULL;
}
r = (char *)malloc(n+1);
memset(r, 0x00, n+1);
k = n - 1;
for(i=n-1; i>=0; i--)
{
if(s[i] == ' ')
{
for(j=0; j<k-i-1; j++)
{
u = i+j+1;
if(s[u] >= 'a' && s[u] <= 'z')
{
r[w++] = s[u] - 'a' + 'A';
}
else if(s[u] >= 'A' && s[u] <= 'Z')
{
r[w++] = s[u] - 'A' + 'a';
}
else
{
r[w++] = s[u];
}
}
r[w++] = ' ';
k = i;
}
else if(i == 0)
{
for(j=0; j<k-i; j++)
{
u = i + j;
if(s[u] >= 'a' && s[u] <= 'z')
{
r[w++] = s[u] - 'a' + 'A';
}
else if(s[u] >= 'A' && s[u] <= 'Z')
{
r[w++] = s[u] - 'A' + 'a';
}
else
{
r[w++] = s[u];
}
}
k = i;
}
}
return r;
}
int main()
{
char s[1000001] = {0};
char *q = NULL;
int n = -1;
fgets(s, 1000001, stdin);
n = strlen(s);
q = trans(s, n);
if(q)
{
printf("%s\n", q);
free(q);
q = NULL;
}
return 0;
}
3.编译源码
$ gcc -o test test.c -std=c89
4.运行及其结果
$ ./test
This is a sample
SAMPLE A IS tHIS
网友评论