美文网首页
c语言字符串变形

c语言字符串变形

作者: 一路向后 | 来源:发表于2022-06-13 21:24 被阅读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
    

    相关文章

      网友评论

          本文标题:c语言字符串变形

          本文链接:https://www.haomeiwen.com/subject/yucamrtx.html