c语言字符串变形

2022-06-13  本文已影响0人  一路向后

1.问题描述

对于一个长度为 n 字符串,我们需要对它做一些变形。

首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。

比如"Hello World"变形后就变成了"wORLD hELLO"。

数据范围: 1\le n \le 10^6 , 字符串中包括大写英文字母、小写英文字母、空格。
进阶:空间复杂度 O(n) , 时间复杂度 O(n)

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
上一篇下一篇

猜你喜欢

热点阅读