SDUT 2352 Run Length Encoding

点我看题目 

题意 :将给定的字符串编码,编码的规则根据两条,1.如果字符串里有连续相等的字符,就变为两个字符,一个是这些连续相同的字符的个数,另一个是这个字符,但是如果数量超过了9个,那就输出9再输出这个字符,剩下的重新按照规则进行,例如AAAA,就输出4A,AAAAAAAAAAA输出9A2A,2.如果字符串里有连续不相等的字符,就将这些字符原样输出并且在前后各加一个1,如果字符串里有刚好有个1,就将这个1变为11,AAAABCCC输出4A1B13C,123444输出11123134,1111111111输出911111。

思路 :就是一道顶麻烦的题,如果不好好读题的话,就很难办,因为有很多细节问题都需要注意,比如说输入空格也算字符,输入换行也要处理。最后一组样例是10个1,按照编码规则先输出9个1,还剩一个1就要根据规则2进行编码,因为是1个1所以要在前后各加一个1,又因为是一个单独的1,所以要把1变成11

#include <iostream>

#include <string.h>

#include <stdio.h>

#include <algorithm>



const int maxn = 424567 ;

char sh[maxn] ;

char ch[maxn] ;



using namespace std;



int main()

{

    while(gets(sh))

    {

        int x = 0,j ;

        int len = strlen(sh) ;

        //   printf("%d",len);

        for(int i = 0 ; i < len ; )

        {

            j = i + 1;

            if(sh[i] == sh[j])

            {

                while(sh[i] == sh[j])

                {

                    j++ ;

                    if(j - i >= 9)

                        break ;

                }

                ch[x++] = j-i+'0' ;

                ch[x++] = sh[i] ;

                i += (j-i) ;

            }

            else

            {

                while((sh[j] != sh[j+1] && j+1 < len) || j == len-1)

                    j++ ;

                ch[x++] = '1' ;

                for(int ii = i ; ii < j ; ii++)

                {

                    ch[x++] = sh[ii] ;

                    if(sh[ii] == '1' )

                        ch[x++] = '1' ;

                    //if(j == 0 && sh[j] != sh[j+1])

                    //ch[x++] = '1' ;

                }

                ch[x++] = '1' ;

                i += (j-i) ;

            }

        }

        ch[x] = '\0' ;

        printf("%s\n",ch) ;

    }

    return 0;

}
View Code

 

你可能感兴趣的:(encoding)