• 字符串压缩


    二、题目描述(40分):
    通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
    压缩规则:
    1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
    2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。

    要求实现函数: 
    void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);

    【输入】 pInputStr:  输入字符串
                lInputLen:  输入字符串长度
    【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

    【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

    示例 
    输入:“cccddecc”   输出:“3c2de2c”
    输入:“adef”     输出:“adef”
    输入:“pppppppp” 输出:“8p”

    这题还有点难,填数据时当时没想到可以先填后面再填前面...

    #include<stdio.h>
    #include<stdlib.h>
    #include<iostream>
    #include<string.h>
    using namespace std;
    void itoa(int n, char *&str)
    {
        char *p = str;
        char *p1 = str;
        char temp;
        int len = 0;
        if (n < 0)
        {
            *p++ = '-';
            n = -n;
        }
        do
        {
            *p++ = n % 10 + '0';
            n = n / 10;
            len++;
           // printf("n%d ",n);
        }while(n > 0);
       // printf("ss%d %s",len,p);
        *p-- = '';
        //printf("%d %s",len,p);
        //if(len % 2 == 1)
        //    len++;
        for( len /= 2; len > 0; len--){
             temp = *p;
            *p-- = *str;
            *str++ = temp;
        }
        str = p1;
    }
    void stringZip1(const char *pInputStr, long lInputLen, char *pOutputStr)
    {
        const char *p = pInputStr;
        int j,num,s,i;
        j = 0;
        num = 1;
        p++;
        while( *p != '')
        {
            while( *p == *(p-1) && *p != '')
            {
                p++;
                num++;
            }
            if( num > 1)
            {
                s = 0;
                int k;
                int temp = num;
                while(num > 0)
                {
                    num /= 10;
                    s++;
                }
                for(i=j,k=0; k < s; i--,k++)
                {
                    pOutputStr[i+s-1] = temp % 10 + '0';
                    temp /= 10;
                }
                j += s;
                pOutputStr[j++] = *(p-1);
                num = 1;
                p++;
            }
            else
                {
                    pOutputStr[j++] = *(p-1);
                    p++;
                }
            }
        if (*(p-1) != *(p-2))
            pOutputStr[j++] = *(p-1);
        pOutputStr[j] = '';
        printf("%s
    ",pOutputStr);
    
    }
    int main()
    {
        char s[40],s1[40];
        char *s2 = (char*)malloc(sizeof(char) * 40);
        while(scanf("%s",s))
        {
            stringZip1(s,strlen(s),s1);
        }
    
    }

    貌似自己写的itoa没有用到,因为后来发现用了反而不好操作...

  • 相关阅读:
    Java实现文件夹下文件实时监控
    JAVA读取文件夹大小
    Java获取Linux上指定文件夹下所有第一级子文件夹
    自定义日志框架实现
    Node爬取简书首页文章
    NodeJS多进程
    NodeJS 连接接MySQL
    NodeJS Web模块
    NodeJS 模块&函数
    NodeJS Stream流
  • 原文地址:https://www.cnblogs.com/george-cw/p/3933384.html
Copyright © 2020-2023  润新知